Android 贴纸
概述
了解过自定义View的童鞋 对Canvas.drawBitmap(Bitmap, Matrix, Paint)这个函数应该不会陌生,Bitmap的位置、大小、旋转角度、扭曲程度等都由Matrix来管理,而实现贴纸效果的就需要借助这个神奇的函数。我们可以通过很多种方法获取到贴纸的Bitmap,也可以很容易的定义绘制Bitmap所使用的Paint,那么剩下我们只需要关心怎样可以借助Matrix来让贴纸随着我们的指尖翩翩起舞。
device-2016-04-07-204711~1.gif
为了更好的管理每个贴纸的Bitmap和Matrix信息,我简单的将二者进行了封装,大家不要在意名字,知道这个类是干嘛的就好了,毕竟如何起一个优雅准确的名字是一个世界性的难题。
public static class ImageGroup {
public Bitmap bitmap;
public Matrix matrix = new Matrix();
//删除贴纸时释放资源时使用
public void release() {
if (bitmap != null) {
bitmap.recycle();
bitmap = null;
}
if (matrix != null) {
matrix.reset();
matrix = null;
}
}
}
说到随着指尖,我们就会想到Android丰富的手势操作,因为是自定义View,所有对Bitmap的操作都需要用到手势触点坐标,因此我使用了View的onTouchEvent(MotionEvent event)方法直接对手势触点就行操作,onTouchEvent也是整个贴纸模块的核心。
public boolean onTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
anchorX = event.getX();
anchorY = event.getY();
moveTag = decalCheck(anchorX, anchorY);
deleteTag = deleteCheck(anchorX, anchorY);
if (moveTag != -1 && deleteTag == -1) {
downMatrix.set(mDecalImageGroupList.get(moveTag).matrix);
mode = DRAG;
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
moveTag = decalCheck(event.getX(0), event.getY(0));
transformTag = decalCheck(event.getX(1), event.getY(1));
if (moveTag != -1 && transformTag == moveTag && deleteTag == -1) {
downMatrix.set(mDecalImageGroupList.get(moveTag).matrix);
mode = ZOOM;
}
oldDistance = getDistance(ev

本文介绍了一种在Android自定义View中实现贴纸功能的方法,包括如何利用Canvas和Matrix进行贴纸的移动、缩放及旋转操作。
最低0.47元/天 解锁文章
1225

被折叠的 条评论
为什么被折叠?



