Android UI(四)云通讯录项目之云端更新进度条实现

简介:

一、前言

    继续AndroidUI系列,UI其实是个前端活,美感是最终的boss阶段。泥瓦匠的美感也就给你们评论评论哈哈,我等UI写到一定地步。我想写下Android的一系列简单入门。为了巩固提升呗。哈哈。下面介入正题。
    有道是路漫漫其修远兮,吾将上下而求索。任何东西都不是一步登天,爱情啥都一样。钱也一样,没人愿意给你1亿,更何况也没愿意给你100的。为什么?没啥的,注意细节,一步一步来。让你值得那一亿就有了。但是要记住

“做人做事第一,技术第二”

二、正文

    泥瓦匠是个爱扯的人。项目的进展也不错,前天友人通了个宵,或是今天降温了,想睡觉。晚上去锻炼下,应该就好了。哈哈~扯淡完毕。今天我们来实现下面这个界面:云通讯录项目之云端更新界面

image

    先理理思路

  • 一个barTop层:一个ImgView或是Button,一个TextView,用styles.xml控制其的样式。
  • 核心中间一个圆形进度条的实现,自定义View。这次的核心讲解。
  • 底部ImgBottom的实现      

三、实现圆形进度条

    实现这个,首先我们得明白关于Canvas Paint的相关知识。这里我也就把涉及到的东西讲下。还是看效果说话吧。关于2D绘图的api都在android.graphics和 android.graphics.drawable包里面。图形相关的有Point(点),RetcF(矩形)等,还有动画相关有 AnimationDrawable、 BitmapDrawable和TransitionDrawable等。

    本例中,其实我们用到的是很简单的两个操作。定义一个矩形(RetcF)然后再矩形区域,画弧线。一个弧线是对应的白色底部,另一个弧线是对应的进度。算 好角度,然后就自然而然的可以了。话不多说,泥瓦匠就上代码了。(代码里面的详细注解,你也应该可以方便的看的懂。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package org.nsg.view;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
 
public class CircleProgressBar extends View
{
     private int maxProgress = 100;
     private int progress = 15;
     private int progressStrokeWidth = 16;
     private int marxArcStorkeWidth = 16;
     /* 画圆所在的距形区域 */
     RectF oval;
     Paint paint;
 
     public CircleProgressBar(Context context, AttributeSet attrs)
     {
         super(context, attrs);
         oval = new RectF();
         paint = new Paint();
     }
 
     @Override
     protected void onDraw(Canvas canvas)
     {
         super.onDraw(canvas);
         int width = this.getWidth();
         int height = this.getHeight();
 
         width  = (width > height) ? height : width;
         height = (width > height) ? height : width;
 
         /* 设置画笔为抗锯齿 */
         paint.setAntiAlias(true);
         /* 设置画笔颜色 */
         paint.setColor(Color.WHITE);
         /* 白色背景 */
         canvas.drawColor(Color.TRANSPARENT);
         /* 线宽 */
         paint.setStrokeWidth(progressStrokeWidth);
         paint.setStyle(Style.STROKE);
 
         /* 左上角x */
         oval.left = marxArcStorkeWidth / 2;
         /* 左上角y */
         oval.top  = marxArcStorkeWidth / 2;
         /* 左下角x */
         oval.right  = width  - marxArcStorkeWidth / 2;
         /* 右下角y */
         oval.bottom = height - marxArcStorkeWidth / 2;
 
         /* 绘制白色圆圈,即进度条背景 */
         canvas.drawArc(oval, -90, 360, false, paint);
         paint.setColor(Color.rgb(0x57, 0x87, 0xb6));
         paint.setStrokeWidth(marxArcStorkeWidth);
         /* 绘制进度圆弧,这里是蓝色 s*/
         canvas.drawArc(oval, -90, ((float) progress / maxProgress) * 360,false, paint);
 
         /* 设置百分比文本 */
         paint.setStrokeWidth(1);
         String text = progress + "%";
         int textHeight = height / 4;
         paint.setTextSize(textHeight);
         int textWidth = (int) paint.measureText(text, 0, text.length());
         paint.setStyle(Style.FILL);
         canvas.drawText(text, width / 2 - textWidth / 2, height / 2 + textHeight / 2, paint);
 
     }
 
     public int getMaxProgress()
     {
         return maxProgress;
     }
 
     public void setMaxProgress(int maxProgress)
     {
         this.maxProgress = maxProgress;
     }
 
     /** 设置进度
      * @param progress 进度百分比
      * @param view  标识进度的节点视图
      */
     public void setProgress(int progress, View view)
     {
         this.progress = progress;
         view.setAnimation(pointRotationAnima(0,(int) (((float) 360 / maxProgress) * progress)));
         this.invalidate();
     }
 
     /** 非UI线程调用 */
     public void setProgressNotInUiThread(int progress, View view)
     {
         this.progress = progress;
         view.setAnimation(pointRotationAnima(0,(int) (((float) 360 / maxProgress) * progress)));
         this.postInvalidate();
     }
 
     /** 进度标注点的动画
      * @param fromDegrees
      * @param toDegrees
      */
     private Animation pointRotationAnima(float fromDegrees, float toDegrees)
     {
         /* 进度点起始位置(图片偏移约54度) */
         int initDegress = 300;
         RotateAnimation animation =
                 new RotateAnimation(fromDegrees,
                         initDegress + toDegrees,
                         Animation.RELATIVE_TO_SELF,
                         0.5f,
                         Animation.RELATIVE_TO_SELF,
                         0.5f);
         /* 设置动画执行时间 */
         animation.setDuration(1);
         /* 设置重复执行次数 */
         animation.setRepeatCount(1);
         /* 设置动画结束后是否停留在结束位置 */
         animation.setFillAfter(true);
         return animation;
     }
     
}
1
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity" >
     
     < RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="46dp"
         android:background="@drawable/bg_black">
         < ImageView
             android:id="@+id/img_user_list_back"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_alignParentLeft="true"
             android:paddingLeft="24dp"
             android:paddingTop="10dp"
             android:paddingBottom="10dp"
             android:clickable="true"
             android:focusable="true"
             android:scaleType="fitXY"
             android:src="@drawable/btn_return"/>
         < TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             style="@style/txt_topbar"
             android:text="云端更新"/>
     </ RelativeLayout >
     
      < org.nsg.main.CircleProgressBar
         android:id="@+id/sync_progress"
         android:layout_width="200dp"
         android:layout_height="200dp"
         android:layout_marginBottom="210dp"
         android:layout_alignBottom="@+id/lay_bottom"
         android:layout_centerHorizontal="true"
          />
 
      < LinearLayout
         android:layout_width="match_parent"
         android:layout_height="50dp"
         android:layout_marginBottom="140dp"
         android:layout_alignBottom="@+id/lay_bottom">
         
         < TextView
             android:id="@+id/syncText"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textColor="@color/red"
             android:paddingLeft="50dp"
             android:textSize="15sp"
             android:text="温馨提醒:"/>
         
         < TextView
             android:id="@+id/syncText"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textColor="@color/black"
             android:textSize="15sp"
             android:text="在Wifi下,更新更有效果"/>
      
     </ LinearLayout >
     
     < Button
        android:id="@+id/syncButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
         android:layout_marginBottom="90dp"
         android:layout_alignBottom="@+id/lay_bottom"
         android:textColor="@color/white"
         android:textSize="22sp"
        android:background="@drawable/user_detail_call_bg"
        android:text="更新" />
     
     < LinearLayout
         android:id="@+id/lay_bottom"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
         android:layout_alignParentBottom="true">
         < ImageView
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:src="@drawable/libe_footer" />
     </ LinearLayout >
     
</ RelativeLayout >

定义好这个View之后,我们就把最难的东西搞定了。代码里面,最后用动画的形式展现给大家,百分比会根据你设计的百分比进行变化。泥瓦匠和大家一 样,都想急切的看到效果图,只要大家如下简单的操作就好了。打开设计的xml文件详细的xml设计我也方便大家贴出来了:其他设计都是简单的,我这边也不 展开讲了。

四、总结

   本章关于云通讯录的界面我会慢慢分享给大家。项目也放在下面的链接供大家下载学习。这期就到这里,泥瓦匠也要休息了。关于代码在下面的链接:http://files.cnblogs.com/Alandre/AndroidUI04.rar 

相关文章
|
2月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
3月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
126 1
|
3月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
143 2
|
3月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
247 0
安卓项目:app注册/登录界面设计
|
29天前
|
前端开发 UED
「Mac畅玩鸿蒙与硬件39」UI互动应用篇16 - 倒计时环形进度条
本篇将带你实现一个倒计时环形进度条应用。用户可以设置倒计时的时间,启动倒计时后,应用会动态显示一个随着时间递减的环形进度条,同时伴有数字倒计时显示。这是结合动画效果和时间管理的实用示例。
120 10
|
1月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
2月前
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
46 2
|
2月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
64 6
|
3月前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
56 2
|
4月前
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
第一个安卓项目 | 中国象棋demo学习