您的位置:首页 > 移动开发 > Android开发

自定义View(三)Android圆环两个颜色交替出现的等待效果

2015-07-20 10:16 671 查看
今天想学习点自定义View的东西就到大神的博客中去看了看,大神不愧是大神,讲解的内容通俗易懂,我也跟着敲了一遍感觉受益匪浅啊,好了,进入今天的正题哈--自定义View之Android圆环两个颜色交替出现的等待效果



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

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

1、自定义View的属性

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

[ 3、重写onMesure ]

4、重写onDraw

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

1、自定义属性:

[java] view
plaincopy





<?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的构造方法中获得我们自定义的属性

[java] view
plaincopy





/**

* 第一圈的颜色

*/

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

[java] view
plaincopy





@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); // 根据进度画圆弧

}

}

大功完成了,当然了,唯一比较纠结的地方就是两个颜色何时切换,如何切换,我采用上面的办法,你也可以自己想想怎么实现。

好了,各位看官留个言,顶一个吧~(转载自张鸿洋的博客
源码地址点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: