android自定义控件学习【1】----自定义卡券View

今日,博主花了点时间看了一篇自定义控件的帖子,看起来好牛X,于是准备自己试试,废话不多说,先来看效果图,今天要做的是自定义锯齿边的卡券View,如下:

效果图

也许,你第一眼看到这个效果会觉得这不就是加个背景图片事儿吗?其实不然,以上效果为纯代码编写。其实也很简单,关键是思考清除自己要出的效果该怎么用算法,下面贴上代码:

</pre><pre name="code" class="java">/**
 * 优惠券自定义View
 * 
 * @author jihf
 * 
 */
public class CouponView extends LinearLayout {
	// 画图用到的类
	private Paint mPaint;
	// 两个圆之间的间距
	private float circleSpace = 8;
	// 圆的半径
	private float circleRadius = 10;
	// 圆心的位置
	private float centerPointX;
	// 圆的数量
	private float circleNum;
	// 不整除的剩余部分(即剩余的不能画圆的部分)
	private float remain;

	public CouponView(Context context) {
		super(context);
	}

	public CouponView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// 构建Paint时直接加上抗锯齿属性
		mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		// 设定使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
		mPaint.setDither(true);
		// 设置画笔的颜色
		mPaint.setColor(Color.WHITE);
		// 设置画笔的样式
		mPaint.setStyle(Paint.Style.FILL);
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		super.onSizeChanged(w, h, oldw, oldh);
		if (remain == 0) {
			/**
			 * 计算不可以画出圆的剩余部分
			 * 
			 * @思考:因为圆间距的个数比圆多一个
			 * 
			 * @算法:(屏幕宽度-一个圆间距)% (圆间距 + 圆直径) 求余
			 */
			remain = (int) ((w - circleSpace) % (circleSpace + 2 * circleRadius));
		}
		// 模运算
		circleNum = (int) ((w - circleSpace) / (circleSpace + 2 * circleRadius));
	}

	public CouponView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 画圆
		for (int i = 0; i < circleNum; i++) {
			// 计算圆心的x轴位置
			centerPointX = remain / 2 + circleSpace + circleRadius
					+ ((circleSpace + 2 * circleRadius) * i);
			// 上方的圆
			canvas.drawCircle(centerPointX, 0, circleRadius, mPaint);
			// 下方的圆
			canvas.drawCircle(centerPointX, getHeight(), circleRadius, mPaint);
		}
	}

}
以上所示代码就是画这个View的全部内容,怎么样,是不是很简单呢?在做这个之前,博主强烈建议各位读者先学习Paint类和Canvas的用法,才能更好的自定义其他任何你心中的View。

今天就到此为止了,感谢大家,欢迎提意见和建议!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值