zoukankan      html  css  js  c++  java
  • Android自定义View 画弧形,文字,并增加动画效果

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


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

    /** 
     * 封装基本View
     * @author ansen 
     * @create time 2015-08-07 
     */  
    public abstract class  BaseView extends View{  
        private MyThread myThread;  
    
        public BaseView(Context context, AttributeSet attrs) {  
            super(context, attrs);  
        }  
      
        public BaseView(Context context) {  
            super(context);  
        }  
          
        protected abstract void onDrawSub(Canvas canvas);//绘制图像
        protected abstract void logic();//逻辑方法  子类实现
          
        @Override  
        protected void onDraw(Canvas canvas) {  
            if(null==myThread){  
                myThread=new MyThread();  
                myThread.start();  
            }else{
                onDrawSub(canvas);
            }
        }
        
        private boolean running=true;//控制循环
        
        @Override
        protected void onDetachedFromWindow() {
        	running=false;//销毁View的时候设置成false,退出无限循环
        	super.onDetachedFromWindow();
        }
        
        //开启一个子线程绘制ui  
        private class MyThread extends Thread{  
            @Override  
            public void run() {  
                while(running){
                	logic();
                    postInvalidate();//重新绘制,会调用onDraw  
                    try {  
                        Thread.sleep(200);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
    }



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

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

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

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

    /** 
     * Android自定义View 画弧形,文字,并增加动画效果 
     * @author ansen 
     * @create time 2015-08-07 
     */  
    public class LogicView extends BaseView{
        private Paint paint;//画笔
        private int x=0;
        private RectF rectF=new RectF(150,150,380,380);  
        private int sweepAngle=0;//弧的结束度数  
        private Random random=new Random();  
        
        
    	public LogicView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		init(); 
    	}
    
    	public LogicView(Context context) {
    		super(context);
    		init(); 
    	}
    	
        //初始化画笔  
        private void  init(){  
            paint=new Paint();  
            paint.setTextSize(60);  
        }
    	
    	@Override
    	protected final void onDrawSub(Canvas canvas) {
            canvas.drawText("Hello World", x, 100, paint);  
            //第一个参数是RectF   左上的x y坐标   右下的x y坐标  
            //第二个参数是 弧形的开始角度  
            //第三个参数是 弧形的结束角度  
            //第四个参数是 true:画扇形   false:画弧线  
            //第五个参数是 画笔  
            canvas.drawArc(rectF, 0, sweepAngle, true, paint); 
    	}
    
    	@Override
    	protected void logic() {
            x+=20;  
            sweepAngle+=3;//每次弧度加3  
              
            //随机设置画笔的颜色  
            int r=random.nextInt(255);  
            int g=random.nextInt(255);  
            int b=random.nextInt(255);  
            paint.setARGB(255, r, g, b);  
              
            if(sweepAngle>=360){//如果弧度大于360°  从头开始  
                sweepAngle=0;  
            }  
              
            if(x>getWidth()){//如果移动到屏幕外,从头开始  
                int textWidth=(int) paint.measureText("Hello World");//测量文字宽度  
                x=0-textWidth;  
            }
    	}
    }



    3.显示View的Activity     MainActivity.java

    public class MainActivity extends Activity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(new LogicView(this));
    	}
    }



    4.效果图如下:

       

       

  • 相关阅读:
    06.04 html
    汉企第一天
    Django之ajax
    Diango之图书管理系统编辑
    Django之模型层&ORM操作
    Django 之模板层
    Django之 路由层
    Django之ORM简单操作(一)
    迭代器、可迭代对象、迭代器对象、生成器、生成器对象、枚举对象
    装饰器
  • 原文地址:https://www.cnblogs.com/yishaochu/p/5078616.html
Copyright © 2011-2022 走看看