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

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

   

Android自定义View 画弧形,文字,并增加动画效果的更多相关文章

  1. Android 自定义View 画圆 画线

    自定义一个DrawCircle继承View 实现构造方法: public DrawCircle(Context context) { super(context); this.mContext = c ...

  2. Android自定义View实现仿QQ实现运动步数效果

    效果图: 1.attrs.xml中 <declare-styleable name="QQStepView"> <attr name="outerCol ...

  3. 自定义view 之多个引导层动画效果

    SupernatantView 如果我英文还可以的话这个应该叫做漂浮在上层的view---引导层 今天闲来无事看了网上的一些引导层案例总感觉如果不是很舒服,就是类似于很死板的显示和消失 我在想能不能弄 ...

  4. Android 自定义 View 绘制

    在 Android 自定义View 里面,介绍了自定义的View的基本概念.同时在 Android 控件架构及View.ViewGroup的测量 里面介绍了 Android 的坐标系 View.Vie ...

  5. Android 自定义 view(三)—— onDraw 方法理解

    前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...

  6. Android自定义View之CircleView

    Android自定义View之CircleView 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/5999 ...

  7. [原] Android 自定义View步骤

    例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能 ...

  8. android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索

    我们的手机通讯录一般都有这样的效果,如下图: OK,这种效果大家都见得多了,基本上所有的android手机通讯录都有这样的效果.那我们今天就来看看这个效果该怎么实现. 一.概述 1.页面功能分析 整体 ...

  9. Android自定义View实战(SlideTab-可滑动的选择器)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52178553 本文出自:[openXu的博客] 目录: 初步分析重写onDraw绘制 重写o ...

随机推荐

  1. javascript的变量声明提升

    这篇随笔是对网上文章的整理吸收 1. javascript的作用域是函数,不是块 2. 在函数内部,javascript解释器会把var变量提升到当前域的最前面,但是函数体不会提升. 看下面例子: v ...

  2. Java Hashtable的实现

    先附源码: package java.util; import java.io.*; /** * This class implements a hash table, which maps keys ...

  3. HTML5新标签<canvas>

    基本用法 首先在body中写个<canvas>,设定大小,个人建议大小要在行内设置,不然在部分情况下会发生错误. CSS部分 给canvas加个边框,这边框只是为了方便看出canvas的边 ...

  4. hoj 1014 Niven Numbers

    新手上路之我的水题之路 刚开始时,我首先想到的是定义一个int数组,然后让输入的数字从最低位开始在循环不断地*base,从而将 k进制转化成十进制:然后再作取模判断就可以了: 这时在将最低位到最高位依 ...

  5. Think in 递归

    网上写递归的文章可以用汗牛充栋来形容了,大多数都非常清晰而又细致的角度上讲解了递归的概念,原理等等.以前学生的时候,递归可以说一直是我的某种死穴,原理,细节我都懂,但是不管是在如何运用或者如何试试算法 ...

  6. 报文解析及CRC类

    /// <summary> /// 报文解析转换类 /// </summary> public class DatagramConvert { public static En ...

  7. ListView.setAdapter(adapter);空指针异常的解决的总结

    报空指针异常一般的情况: 1,没有找到布局文件的ID  检验是不是id重复或者写错了 2.控件没有实例化 3.没有找到布局文件的id,要看看是不是加载了布局了,必须加载了对应的布局才能找到对应布局下的 ...

  8. Android ANR 分析解决方法

    一:什么是ANR ANR:Application Not Responding,即应用无响应 二:ANR的类型 ANR一般有三种类型: 1. KeyDispatchTimeout(5 seconds) ...

  9. 玩转Asp.net MVC 的八个扩展点

    MVC模型以低耦合.可重用.可维护性高等众多优点已逐渐代替了WebForm模型.能够灵活使用MVC提供的扩展点可以达到事半功倍的效果,另一方面Asp.net MVC优秀的设计和高质量的代码也值得我们去 ...

  10. Python黑帽编程2.1 Python编程哲学

    Python黑帽编程2.1  Python编程哲学 本节的内容有些趣味性,涉及到很多人为什么会选择Python,为什么会喜欢这门语言.我带大家膜拜下Python作者的Python之禅,然后再来了解下P ...