Android自定义View 画弧形,文字,并增加动画效果

简介:

一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧。


1.封装一个抽象的View类   BaseView.java

  1. /**  
  2.  * 封装基本View 
  3.  * @author ansen  
  4.  * @create time 2015-08-07  
  5.  */    
  6. public abstract class  BaseView extends View{    
  7.     private MyThread myThread;    
  8.   
  9.     public BaseView(Context context, AttributeSet attrs) {    
  10.         super(context, attrs);    
  11.     }    
  12.     
  13.     public BaseView(Context context) {    
  14.         super(context);    
  15.     }    
  16.         
  17.     protected abstract void onDrawSub(Canvas canvas);//绘制图像  
  18.     protected abstract void logic();//逻辑方法  子类实现  
  19.         
  20.     @Override    
  21.     protected void onDraw(Canvas canvas) {    
  22.         if(null==myThread){    
  23.             myThread=new MyThread();    
  24.             myThread.start();    
  25.         }else{  
  26.             onDrawSub(canvas);  
  27.         }  
  28.     }  
  29.       
  30.     private boolean running=true;//控制循环  
  31.       
  32.     @Override  
  33.     protected void onDetachedFromWindow() {  
  34.         running=false;//销毁View的时候设置成false,退出无限循环  
  35.         super.onDetachedFromWindow();  
  36.     }  
  37.       
  38.     //开启一个子线程绘制ui    
  39.     private class MyThread extends Thread{    
  40.         @Override    
  41.         public void run() {    
  42.             while(running){  
  43.                 logic();  
  44.                 postInvalidate();//重新绘制,会调用onDraw    
  45.                 try {    
  46.                     Thread.sleep(200);    
  47.                 } catch (InterruptedException e) {    
  48.                     e.printStackTrace();    
  49.                 }    
  50.             }    
  51.         }    
  52.     }    
  53. }  



2.在逻辑View类中实现自己想要绘制的内容   LogicView.java  

   1).集成BaseView,实现onDrawSub()跟logic()抽象方法

   2).在onDraw()方法中绘制图形   例如:画弧形   画文字

   3).onDrawSub()方法中实现绘制的逻辑   

  1. /**  
  2.  * Android自定义View 画弧形,文字,并增加动画效果  
  3.  * @author ansen  
  4.  * @create time 2015-08-07  
  5.  */    
  6. public class LogicView extends BaseView{  
  7.     private Paint paint;//画笔  
  8.     private int x=0;  
  9.     private RectF rectF=new RectF(150,150,380,380);    
  10.     private int sweepAngle=0;//弧的结束度数    
  11.     private Random random=new Random();    
  12.       
  13.       
  14.     public LogicView(Context context, AttributeSet attrs) {  
  15.         super(context, attrs);  
  16.         init();   
  17.     }  
  18.   
  19.     public LogicView(Context context) {  
  20.         super(context);  
  21.         init();   
  22.     }  
  23.       
  24.     //初始化画笔    
  25.     private void  init(){    
  26.         paint=new Paint();    
  27.         paint.setTextSize(60);    
  28.     }  
  29.       
  30.     @Override  
  31.     protected final void onDrawSub(Canvas canvas) {  
  32.         canvas.drawText("Hello World", x, 100, paint);    
  33.         //第一个参数是RectF   左上的x y坐标   右下的x y坐标    
  34.         //第二个参数是 弧形的开始角度    
  35.         //第三个参数是 弧形的结束角度    
  36.         //第四个参数是 true:画扇形   false:画弧线    
  37.         //第五个参数是 画笔    
  38.         canvas.drawArc(rectF, 0, sweepAngle, true, paint);   
  39.     }  
  40.   
  41.     @Override  
  42.     protected void logic() {  
  43.         x+=20;    
  44.         sweepAngle+=3;//每次弧度加3    
  45.             
  46.         //随机设置画笔的颜色    
  47.         int r=random.nextInt(255);    
  48.         int g=random.nextInt(255);    
  49.         int b=random.nextInt(255);    
  50.         paint.setARGB(255, r, g, b);    
  51.             
  52.         if(sweepAngle>=360){//如果弧度大于360°  从头开始    
  53.             sweepAngle=0;    
  54.         }    
  55.             
  56.         if(x>getWidth()){//如果移动到屏幕外,从头开始    
  57.             int textWidth=(int) paint.measureText("Hello World");//测量文字宽度    
  58.             x=0-textWidth;    
  59.         }  
  60.     }  
  61. }  



3.显示View的Activity     MainActivity.java

  1. public class MainActivity extends Activity {  
  2.     @Override  
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         super.onCreate(savedInstanceState);  
  5.         setContentView(new LogicView(this));  
  6.     }  
  7. }  



4.效果图如下:

   

   

目录
相关文章
|
23天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
24天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
30 5
|
2月前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
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 应用提供支持。
32 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的绘制流程
25 2
|
2月前
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
39 3
|
4月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
View的绘制和事件处理是两个重要的主题,上一篇《图解 Android事件分发机制》已经把事件的分发机制讲得比较详细了,这一篇是针对View的绘制,View的绘制如果你有所了解,基本分为measure、layout、draw 过程,其中比较难理解就是measure过程,所以本篇文章大幅笔地分析measure过程,相对讲得比较详细,文章也比较长,如果你对View的绘制还不是很懂,对measure过程掌握得不是很深刻,那么耐心点,看完这篇文章,相信你会有所收获的。
122 3