预览效果
目录
ChangePictureView.java
代码
public class ChangePictureView extends View {
//Y轴方向旋转角度
private float degreeY;
//不变的那一半,Y轴方向旋转角度
private float fixDegreeY;
//Z轴方向(平面内)旋转的角度
private float degreeZ;
private Paint paint;
private Bitmap bitmap;
private Camera camera;
public ChangePictureView(Context context) {
super(context);
initView();
}
public ChangePictureView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public ChangePictureView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.icon);
camera = new Camera();
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
float newZ = -displayMetrics.density * 6;
camera.setLocation(0, 0, newZ);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int bitmapWidth = bitmap.getWidth();
int bitmapHeight = bitmap.getHeight();
int centerX = getWidth() / 2;
int centerY = getHeight() / 2;
int x = centerX - bitmapWidth / 2;
int y = centerY - bitmapHeight / 2;
//画变换的一半
//先旋转,再裁切,再使用camera执行3D动效,**然后保存camera效果**,最后再旋转回来
canvas.save();
camera.save();
canvas.translate(centerX, centerY);
canvas.rotate(-degreeZ);
camera.rotateY(degreeY);
camera.applyToCanvas(canvas);
//计算裁切参数时清注意,此时的canvas的座标系已经移动
canvas.clipRect(0, -centerY, centerX, centerY);
canvas.rotate(degreeZ);
canvas.translate(-centerX, -centerY);
camera.restore();
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();
//画不变换的另一半
canvas.save();
camera.save();
canvas.translate(centerX, centerY);
canvas.rotate(-degreeZ);
//计算裁切参数时清注意,此时的canvas的座标系已经移动
canvas.clipRect(-centerX, -centerY, 0, centerY);
//此时的canvas的座标系已经旋转,所以这里是rotateY
camera.rotateY(fixDegreeY);
camera.applyToCanvas(canvas);
canvas.rotate(degreeZ);
canvas.translate(-centerX, -centerY);
camera.restore();
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();
}
/**
* 启动动画之前调用,把参数reset到初始状态
*/
public void reset() {
degreeY = 0;
fixDegreeY = 0;
degreeZ = 0;
}
public void setFixDegreeY(float fixDegreeY) {
this.fixDegreeY = fixDegreeY;
invalidate();
}
public void setDegreeY(float degreeY) {
this.degreeY = degreeY;
invalidate();
}
public void setDegreeZ(float degreeZ) {
this.degreeZ = degreeZ;
invalidate();
}
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
invalidate();
}
}