马上春节,写个应景的控件
思路分析
1.红包沿着不同的轨迹由上往下运动
2.当手指捕获到一个红包,红包停止原先的运动,可以随着手指的滑动做跟手操作
3.当手指动作停止后,红包放大
4.通过滑动刮开红包,看到期待已久的money
大体知识点概况
1.属性动画,实现红包按照贝塞尔曲线运动和放大效果
2.实现一个可移动的view,可以参考我的另一篇博客http://blog.csdn.net/xuan_xiaofeng/article/details/50463595
3.图片的结合模式,主要是实现刮开红包
4.自定义控件的相关知识
实战
1.先来做个红包。继承view,做点初始化的工作
private void init() {
mPath = new Path();
mRandom = new Random();
initPaint();
initMoneyPaint();
mText = moneys[mRandom.nextInt(moneys.length)];
//获取字体的宽高
moneyPaint.getTextBounds(mText, 0, mText.length(), mTextBound);
}
private void initPaint() {
mPaint = new Paint();
mPaint.setColor(Color.parseColor("#c0c0c0"));
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeCap(Paint.Cap.ROUND);
/**
* 设置接合处的形态
*/
mPaint.setStrokeJoin(Paint.Join.ROUND);
/**
* 抗抖动
*/
mPaint.setDither(true);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(PAINT_WIDTH);
}
/**
* money画笔
*/
private void initMoneyPaint() {
moneyPaint = new Paint();
moneyPaint.setColor(Color.RED);
moneyPaint.setAntiAlias(true);
moneyPaint.setTextSize(30);
mTextBound = new Rect();
moneyPaint.getTextBounds(moneys[0], 0, moneys[0].length(), mTextBound);
}
2.创建一个画布,就是一个绘制一个红包的图片,依据手指在控件上的滑动路径,除去图片的结合部分
mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
Bitmap bitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.red_packet));
mCanvas.drawBitmap(bitmap, null, new RectF(0, 0, width, height), null);
//设置图片的结合方式
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
mCanvas.drawPath(mPath, mPaint);
canvas.drawBitmap(mBitmap, 0, 0, null);
public boolean onTouchEvent(MotionEvent event) {
x = (int) event.getX();
y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//路径的初始化位置
mPath.moveTo(x, y);
break;
case MotionEvent.ACTION_MOVE:
if (movable) {
// 跟手滑效果
setX(x + getLeft() + getTranslationX() - getWidth() / 2);
setY(y + getTop() + getTranslationY() - getHeight() / 2);
} el