zoukankan      html  css  js  c++  java
  • Android 自己定义View (三) 圆环交替 等待效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24500107

    一个朋友今天有这么个需求(下图)。我认为那自己定义View来做还是非常适合的,就做了下。顺便和大家分享下,对于自己定义View多练没坏处么。假设你看了前两篇,那么这篇一定so easy 。


    效果就这样。分析了一下。大概有这几个属性,两个颜色。一个速度。一个圆环的宽度。

    还是我们自定View的那几个步骤:

    1、自己定义View的属性

    2、在View的构造方法中获得我们自己定义的属性

    [ 3、重写onMesure ]

    4、重写onDraw

    -------------------------------------------------------------------------------------------------------------------

    1、自己定义属性:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <attr name="firstColor" format="color" />
        <attr name="secondColor" format="color" />
        <attr name="circleWidth" format="dimension" />
        <attr name="speed" format="integer" />
    
        <declare-styleable name="CustomProgressBar">
            <attr name="firstColor" />
            <attr name="secondColor" />
            <attr name="circleWidth" />
            <attr name="speed" />
        </declare-styleable>
    
    </resources>

    2、在View的构造方法中获得我们自己定义的属性

    /**
    	 * 第一圈的颜色
    	 */
    	private int mFirstColor;
    	/**
    	 * 第二圈的颜色
    	 */
    	private int mSecondColor;
    	/**
    	 * 圈的宽度
    	 */
    	private int mCircleWidth;
    	/**
    	 * 画笔
    	 */
    	private Paint mPaint;
    	/**
    	 * 当前进度
    	 */
    	private int mProgress;
    
    	/**
    	 * 速度
    	 */
    	private int mSpeed;
    
    	/**
    	 * 是否应该開始下一个
    	 */
    	private boolean isNext = false;
    
    	public CustomProgressBar(Context context, AttributeSet attrs)
    	{
    		this(context, attrs, 0);
    	}
    
    	public CustomProgressBar(Context context)
    	{
    		this(context, null);
    	}
    
    	/**
    	 * 必要的初始化,获得一些自己定义的值
    	 * 
    	 * @param context
    	 * @param attrs
    	 * @param defStyle
    	 */
    	public CustomProgressBar(Context context, AttributeSet attrs, int defStyle)
    	{
    		super(context, attrs, defStyle);
    		TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomProgressBar, defStyle, 0);
    		int n = a.getIndexCount();
    
    		for (int i = 0; i < n; i++)
    		{
    			int attr = a.getIndex(i);
    			switch (attr)
    			{
    			case R.styleable.CustomProgressBar_firstColor:
    				mFirstColor = a.getColor(attr, Color.GREEN);
    				break;
    			case R.styleable.CustomProgressBar_secondColor:
    				mSecondColor = a.getColor(attr, Color.RED);
    				break;
    			case R.styleable.CustomProgressBar_circleWidth:
    				mCircleWidth = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
    						TypedValue.COMPLEX_UNIT_PX, 20, getResources().getDisplayMetrics()));
    				break;
    			case R.styleable.CustomProgressBar_speed:
    				mSpeed = a.getInt(attr, 20);// 默认20
    				break;
    			}
    		}
    		a.recycle();
    		mPaint = new Paint();
    		// 画图线程
    		new Thread()
    		{
    			public void run()
    			{
    				while (true)
    				{
    					mProgress++;
    					if (mProgress == 360)
    					{
    						mProgress = 0;
    						if (!isNext)
    							isNext = true;
    						else
    							isNext = false;
    					}
    					postInvalidate();
    					try
    					{
    						Thread.sleep(mSpeed);
    					} catch (InterruptedException e)
    					{
    						e.printStackTrace();
    					}
    				}
    			};
    		}.start();
    
    	}
    

    3、直接重写onDraw,这不须要重写onMeasure

    @Override
    	protected void onDraw(Canvas canvas)
    	{
    
    		int centre = getWidth() / 2; // 获取圆心的x坐标
    		int radius = centre - mCircleWidth / 2;// 半径
    		mPaint.setStrokeWidth(mCircleWidth); // 设置圆环的宽度
    		mPaint.setAntiAlias(true); // 消除锯齿
    		mPaint.setStyle(Paint.Style.STROKE); // 设置空心
    		RectF oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius); // 用于定义的圆弧的形状和大小的界限
    		if (!isNext)
    		{// 第一颜色的圈完整。第二颜色跑
    			mPaint.setColor(mFirstColor); // 设置圆环的颜色
    			canvas.drawCircle(centre, centre, radius, mPaint); // 画出圆环
    			mPaint.setColor(mSecondColor); // 设置圆环的颜色
    			canvas.drawArc(oval, -90, mProgress, false, mPaint); // 依据进度画圆弧
    		} else
    		{
    			mPaint.setColor(mSecondColor); // 设置圆环的颜色
    			canvas.drawCircle(centre, centre, radius, mPaint); // 画出圆环
    			mPaint.setColor(mFirstColor); // 设置圆环的颜色
    			canvas.drawArc(oval, -90, mProgress, false, mPaint); // 依据进度画圆弧
    		}
    
    	}

    大功完毕了,当然了,唯一比較纠结的地方就是两个颜色何时切换。怎样切换,我採用上面的办法,你也能够自己想想怎么实现。


    好了,各位看官留个言,顶一个吧~


    源代码点击下载





  • 相关阅读:
    POJ 1328 Radar Installation
    POJ 1700 Crossing River
    POJ 1700 Crossing River
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3069 Saruman's Army(贪心)
    poj 3069 Saruman's Army(贪心)
    Redis 笔记与总结2 String 类型和 Hash 类型
    数据分析方法有哪些_数据分析方法
    数据分析方法有哪些_数据分析方法
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6729339.html
Copyright © 2011-2022 走看看