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

最近看到很多国内和国外的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);

	}

这样基本就完成了最开始的设想,具体效果如下图所示:

时间: 2024-10-21 22:14:05

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

Android中ViewFlipper的使用及设置动画效果实例详解_Android

本文实例讲述了Android中ViewFlipper的使用及设置动画效果.分享给大家供大家参考,具体如下: 说到左右滑动,其实实现左右滑动的方式很多,有ViewPaer,自定义实现Viewgroup,gallery等都可以达到这种效果.这里做下ViewFliper实现左右滑动的效果. 会用到以下的技术: 1.ViewFlipper 2.GestureDetector 3.Animation 主要是这三个类在起作用. ViewFlipper,不妨把它看做一个容器吧,你可以把许多的View放在这个容

Android中ViewFlipper的使用及设置动画效果实例详解

本文实例讲述了Android中ViewFlipper的使用及设置动画效果.分享给大家供大家参考,具体如下: 说到左右滑动,其实实现左右滑动的方式很多,有ViewPaer,自定义实现Viewgroup,gallery等都可以达到这种效果.这里做下ViewFliper实现左右滑动的效果. 会用到以下的技术: 1.ViewFlipper 2.GestureDetector 3.Animation 主要是这三个类在起作用. ViewFlipper,不妨把它看做一个容器吧,你可以把许多的View放在这个容

android中只要View类及其子类有xml属性吗

问题描述 android中只要View类及其子类有xml属性吗 android中只要View类及其子类有xml属性吗,还有其他什么类有xml属性呢,它们的xml属性实际是它们的常量吗 解决方案 XML 在 Android 中用来布局控件的位置与属性,XML 做为标识语言也可以做其它用途的. 至于 Android 中是否有其它类也使用 XML 不太清楚,但至少也可以用的.XML 如果使用,做为变量是正常的.但为什么是常量呢? 解决方案二: 不知道理想表达的是什么意思,Android控件xml配置归

android中给view添加一个按着才触发的事件 要一直按着 松开触发功能关闭事件

问题描述 android中给view添加一个按着才触发的事件 要一直按着 松开触发功能关闭事件 如题,android中给view添加一个按着才触发的事件 要一直按着 松开触发功能关闭事件 ,一个图片 按着可以开启录音功能 松开就关闭录音 这个事件怎么添加 解决方案 你需要按下图片的时候开始录音,松开的时候停止录音,可以监听图片的触摸事件,按下的时候开始,抬起的时候结束. 代码如下: view.setOnTouchListener(new OnTouchListener() { @Override

android中让view变大变小

问题描述 android中让view变大变小 像这种 四格画面播放视频的 小格子能变大占满的 要怎么弄 解决方案 变大变小可以用view.setScaleX和setScaleY,使用前分别设置轴心(setPivotX).要动画而不是直接突然变大的话用属性动画,属性动画改变scaleX和scaleY值.补间动画在这里不好用 不需要动画的话,这里可以用把其他View都gone掉更好,用线性布局和weight去1/4平分空间,gone掉别的view的时候这个就自然变大占满了 或者应该播放时上面蒙层一个

Android中自定义view实现侧滑效果_Android

效果图: 看网上的都是两个view拼接,默认右侧的不显示,水平移动的时候把右侧的view显示出来.但是看最新版QQ上的效果不是这样的,但给人的感觉却很好,所以献丑来一发比较高仿的. 知识点: 1.ViewDragHelper 的用法: 2.滑动冲突的解决: 3.自定义viewgroup. ViewDragHelper 出来已经比较久了 相信大家都比较熟悉,不熟悉的话google一大把这里主要简单用一下它的几个方法 1.tryCaptureView(View child, int pointerI

Android实现游戏中的渐隐和渐现动画效果_Android

1实现渐隐的动画 在程序中实现可以通过如下方式 View view = new View(context);//执行动画的View AlphaAnimation aa = new AlphaAnimation(1.0f, 0.0f);//创建一个AlphaAnimation 对象,渐变从1->0 aa.setDuration(1500);//设置持续时间 aa.setFillAfter(true);//设置这个View最后的状态,由于是从1->0,所以最后的是消失状态(最后是看不到见这个Vie

Android中自定义view实现侧滑效果

效果图: 看网上的都是两个view拼接,默认右侧的不显示,水平移动的时候把右侧的view显示出来.但是看最新版QQ上的效果不是这样的,但给人的感觉却很好,所以献丑来一发比较高仿的. 知识点: 1.ViewDragHelper 的用法: 2.滑动冲突的解决: 3.自定义viewgroup. ViewDragHelper 出来已经比较久了 相信大家都比较熟悉,不熟悉的话google一大把这里主要简单用一下它的几个方法 1.tryCaptureView(View child, int pointerI

android-如何实现一个类似手机360卫士优化过程中的类似时间轴的动画效果?

问题描述 如何实现一个类似手机360卫士优化过程中的类似时间轴的动画效果? 在新版360卫士中,点击优化后,会有一个类似时间轴的动画效果,具体是有一个时间轴,应该是一个listView,每行有一个圆形的imageView,第一行的图片围绕着中心进行转动,转完后是第二行的图片转,以此类推 解决方案 http://www.tuicool.com/articles/j2aimiE