預覽效果
目錄
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();
}
}