转载请注明出处:http://blog.csdn.net/xiaohao0724/article/details/54375779
通过上一篇的学习相信我们已经对自定义控件有了一定程度的了解,本篇我们将实现点击屏幕时以点击的这个点为圆心画圆并放大的效果。
效果如下图:
1、自定义RingView继承View添加其构造方法并创建画笔
public class RingView extends View {
private static final String TAG = "Havorld";
/**
* 圆心的X坐标
*/
private float cx;
/**
* 圆心的Y坐标
*/
private float cy;
/**
* 圆环半径
*/
private float radius;
/**
* 默认画笔
*/
private Paint paint;
private int[] colors = new int[] { Color.BLUE, Color.RED, Color.YELLOW,
Color.GREEN, Color.DKGRAY };
protected boolean isRunning = false;
public RingView(Context context) {
this(context, null);
}
public RingView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
radius = 0;
paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Style.STROKE); // 空心圆
paint.setStrokeWidth(radius / 4); // 画笔宽度 半径4分之一
paint.setColor(colors[(int) (Math.random() * 5)]); // 画笔颜色
paint.setAlpha(255); // 不透明
}
}
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
// 设置透明度
int alpha = paint.getAlpha();
if (alpha == 0) {
isRunning = false;
}
// 透明度每次-10, 慢慢变透明
alpha = Math.max(0, alpha - 10);
paint.setAlpha(alpha);
// 设置半径
radius += 5; // 半径越来越大
paint.setStrokeWidth(radius / 3);
invalidate();
if (isRunning) {
handler.sendEmptyMessageDelayed(0, 50); // 继续递归调用
}
};
};
/**
* 执行动画
*/
private void startAnim() {
isRunning = true;
handler.sendEmptyMessageDelayed(0, 100);
}
// 销毁View的时候调用
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
isRunning = false;
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawCircle(cx, cy, radius, paint);
}
3、通过复写onTouchEvent方法处理按下事件确定圆心
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
cx = event.getX();
cy = event.getY();
initView();
startAnim();
}
return true;
}
点击下载源码