Android自定义控件之自定义View(二)

转载请注明出处: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); // 不透明
	}
}


2、通过Handler递归调用onDraw画圆

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;

	}

点击下载源码


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值