zoukankan      html  css  js  c++  java
  • Android UI(四)云通讯录项目之云端更新进度条实现

    作者:泥沙砖瓦浆木匠
    网站
    http://blog.csdn.net/jeffli1993
    个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。
    交流QQ群:【
    编程之美 365234583http://jq.qq.com/?_wv=1027&k=XVfBTo

    一、前言

        继续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)然后再矩形区域,画弧线。一个弧线是对应的白色底部,另一个弧线是对应的进度。算好角度,然后就自然而然的可以了。话不多说,泥瓦匠就上代码了。(代码里面的详细注解,你也应该可以方便的看的懂。)

    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;
    	}
    	
    }
     
    <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  

       如以上文章或链接对你有帮助的话,别忘了在文章按钮或到页面右下角点击 “赞一个” 按钮哦。你也可以点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章

  • 相关阅读:
    VUE调用函数,以及event的讲解
    VUE双向绑定,以及表达式自增
    使用VUE的准备工作,以及显示文本
    MVC中VUE的学习
    Redis
    C# form表单提交enctype="multipart/form-data" 与 enctype="application/x-www-form-urlencoded" 两者之间的区别
    C# 导入导出
    文件压缩,解压缩
    [vue-router] Duplicate named routes definition: { name: "Front", path: "/home/front" }
    * @/components/widget/AddBands in ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/components/pages/Brands.vue
  • 原文地址:https://www.cnblogs.com/Alandre/p/4138121.html
Copyright © 2011-2022 走看看