通过Canvas的叠加实现Android中环形View的颜色填充动画效果

简介: 最近看到很多国内和国外的APP很多表示数据的方式都是通过一个圆环和数字动态展现,很是生动啊,由此也想做个简单的模型试一试效果! 在Android中实现一种效果的方式有很多种,本人使用继承View类,通过Paint和Canvas绘图叠加的方式实现。

最近看到很多国内和国外的APP很多表示数据的方式都是通过一个圆环和数字动态展现,很是生动啊,由此也想做个简单的模型试一试效果!

在Android中实现一种效果的方式有很多种,本人使用继承View类,通过Paint和Canvas绘图叠加的方式实现。

首先新建一个RingView继承View类,实现构造器函数如下:(同时获取屏幕的宽和高)

      public RingView(Context context, AttributeSet attrs) {
		super(context, attrs);
		//获取屏幕的宽,高
		WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
						
		width = wm.getDefaultDisplay().getWidth();
		height = wm.getDefaultDisplay().getHeight();
	}
接下来实现draw方法:

首先要绘制一个放在最底部的一个圆形,颜色设置为灰色:

@Override
	public void draw(Canvas canvas) {
 		// TODO Auto-generated method stub
		
		 //将圆心设置在屏幕中心
		int pointWidth = width / 2;
		 int pointHeight = height / 2;
		
		Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		 paint.setColor(Color.rgb(220, 220, 220));
		canvas.drawCircle(pointWidth, pointHeight, 100, paint);
	}


接下来需要在其上边叠加一个画弧的Canvas,颜色设置为红色:

        @Override
	    public void draw(Canvas canvas) {
		 // TODO Auto-generated method stub
		
		...		
		 paint.setColor(Color.RED);
		 RectF f = new RectF(pointWidth - 100, pointHeight - 100, pointWidth + 100, pointHeight + 100);
		 canvas.drawArc(f, -90f, i, true, paint);
	   }

想要变成圆环状,需要在其上边再次绘制一个圆形,以遮挡住弧形,实现圆环状的:颜色设置为白色

@Override
	public void draw(Canvas canvas) {
		// TODO Auto-generated method stub
		
		...		
 		paint.setColor(Color.WHITE);
		canvas.drawCircle(pointWidth, pointHeight, 80, paint);
	}

到目前为止,圆环状已经出来了,但是我们的目的不是这样就结束的,还要实现动态显示和数据的关联,所以需要在一个Activity中获取数据并且更改第二层中Canvas绘制扇形的弧度大小,实现动态数据绑定。

在MainActivity中通过Handler方式提交invalidate()重绘界面,实现动态绘制View,首先在MainActivity中建立一个内部类CircleThread:

    private class CircleThread implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			while(!Thread.currentThread().isInterrupted()){
				try {
					Thread.sleep(100);
					/**
					 * 在新的线程中,发送消息给View,更新界面数据
					 * 通过m++实现加速度方式的不断加速绘制弧形
					 * i代表要绘制扇形的角度大小,默认下290度
					 */
					m++;
					Message msg = new Message();
					msg.what = 1;
					if(i < 290){
						i += m;
					}else{
						i = 290;
						return;
					}
					msg.obj = i;
					circleHandler.sendMessage(msg);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
    	
    }
发送消息给Handler,更新View界面

       private Handler circleHandler = new Handler(){
		
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if(msg.what == 1){
				int temp = (Integer)msg.obj;
				ring.setI(temp);
				ring.invalidate();
			}
		};
	};
然后在onCreate方法中开启新的线程,实现动态的效果

new Thread(new CircleThread()).start();
之后自己还实现了在EditText输入框中输入数据和绘制的弧形绑定,这部分具体代码就舍略了......

实现动态绘制环形之后,我们还需要知道环形所代表的数值大小。而不是一个大概的抽象的数据,所以我们需要在View的onDraw方法中实现显示当前弧度的大小值:

@Override
	public void draw(Canvas canvas) {
		// TODO Auto-generated method stub
		
		...
		//绘制文字
		paint.setColor(Color.BLACK);
		//计算出数字的长度
		float lenTxt = paint.measureText(String.valueOf(i));
		canvas.drawText(String.valueOf(i), pointWidth - lenTxt / 2, pointHeight, paint);
		
	}
这样基本就完成了最开始的设想,具体效果如下图所示:










目录
相关文章
|
2月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
93 0
|
21天前
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
33 2
|
1月前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
33 5
|
2月前
|
缓存 数据处理 Android开发
在 Android 中使用 RxJava 更新 View
【10月更文挑战第20天】使用 RxJava 来更新 View 可以提供更优雅、更高效的解决方案。通过合理地运用操作符和订阅机制,我们能够轻松地处理异步数据并在主线程中进行 View 的更新。在实际应用中,需要根据具体情况进行灵活运用,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在 Android 中使用 RxJava 更新 View 的技巧和方法,为开发高质量的 Android 应用提供有力支持。
|
2月前
|
缓存 调度 Android开发
Android 在子线程更新 View
【10月更文挑战第21天】在 Android 开发中,虽然不能直接在子线程更新 View,但通过使用 Handler、AsyncTask 或 RxJava 等方法,可以实现子线程操作并在主线程更新 View 的目的。在实际应用中,需要根据具体情况选择合适的方法,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在子线程更新 View 的技巧和方法,为开发高质量的 Android 应用提供支持。
35 2
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
26 2
|
2月前
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
44 3
|
2月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
3月前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。