写点什么

自定义 View:三维旋转

用户头像
Changing Lin
关注
发布于: 刚刚
自定义 View:三维旋转

1.知识点

  • 核心类:android.graphics.Camera,用于 3D 转换和矩阵变换,常应用于 Canvas

  • rotate() / rotateX() / rotateY() / rotateZ():让 Canvas 围绕 X/Y/Z 轴旋转多少°

  • translate():让 Canvas 在 X/Y/Z 轴上移动多少距离

  • setLocation():设置 Camera 的应用位置,默认在 X/Y/Z 轴上是 0, 0, -8

2.原理

  • 一般只⽤ rotateX() 和 rorateY() 来做沿 x 轴或 y 轴的旋转,以及使⽤setLocation() 来调整放缩的视觉幅度。

  • 对 Camera 变换之后,要用 Camera.applyToCanvas(Canvas) 来应用到 Canvas

  • setLocation():这个⽅法一般前两个参数都填 0,第三个参数为负值。由于这个值的单位是硬编码写死的,因此像素密度越⾼的手机,相当于 Camera 距离 View 越近,所以最好把这个值写成与机器的 density 成正⽐比的一个负值,例如 -6 * density。

3.代码


package com.example.hellojnicallback;
import android.content.Context;import android.graphics.Bitmap;import android.graphics.Camera;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Path;import android.util.AttributeSet;import android.view.View;
import androidx.annotation.Nullable;
public class CameraView extends View { Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
public CameraView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); }
Bitmap bitmap; Camera camera = new Camera(); private static final int WIDTH = 200;
{ bitmap = Util.getAvatar(getResources(), WIDTH, R.drawable.inforec); camera.rotateX(30); // 围绕X轴旋转多少° }
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);
canvas.translate(100+WIDTH/2, 100+WIDTH/2); camera.applyToCanvas(canvas); canvas.translate(-(100+WIDTH/2), -(100+WIDTH/2)); canvas.drawBitmap(bitmap, 100, 100, paint); }}
复制代码


发布于: 刚刚阅读数: 2
用户头像

Changing Lin

关注

获得机遇的手段远超于固有常规之上~ 2020.04.29 加入

我能做的,就是调整好自己的精神状态,以最佳的面貌去面对那些未曾经历过得事情,对生活充满热情和希望。

评论

发布
暂无评论
自定义 View:三维旋转