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.效果图如下:

   

   

目录
相关文章
|
2月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
32 1
|
2月前
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
47 2
|
2月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
2月前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
44 5
|
3月前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
3月前
|
缓存 数据处理 Android开发
在 Android 中使用 RxJava 更新 View
【10月更文挑战第20天】使用 RxJava 来更新 View 可以提供更优雅、更高效的解决方案。通过合理地运用操作符和订阅机制,我们能够轻松地处理异步数据并在主线程中进行 View 的更新。在实际应用中,需要根据具体情况进行灵活运用,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在 Android 中使用 RxJava 更新 View 的技巧和方法,为开发高质量的 Android 应用提供有力支持。
|
3月前
|
缓存 调度 Android开发
Android 在子线程更新 View
【10月更文挑战第21天】在 Android 开发中,虽然不能直接在子线程更新 View,但通过使用 Handler、AsyncTask 或 RxJava 等方法,可以实现子线程操作并在主线程更新 View 的目的。在实际应用中,需要根据具体情况选择合适的方法,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在子线程更新 View 的技巧和方法,为开发高质量的 Android 应用提供支持。
46 2
|
Java Android开发 UED
Android的动画效果浅解析
毕业设计中用到了一些动画效果,个人感觉还是蛮有用的。所以记录一下,是很多地方可以用的小而实用的动画效果。 首先要介绍的是只有在两个Activity跳转之间才能用到的overridePendingTransition,从字面意思来看,它跟切换有关。
1101 0
|
1月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
55 19
|
1月前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
60 14