Android Camera控制图旋转、倾斜 - 可用于实现伪3D效果

来源:互联网 发布:微信java通用版jar 编辑:程序博客网 时间:2024/04/28 01:24


Camera是什么?
android.hardware.Camera
android.graphics.Camera


有两个Camera类,前者负责拍照功能,后者负责图形先关,看包名就看的出来,前者是hardware包下,后者graphics包下。


android.graphics.Camera   - API注释
A camera instance can be used to compute 3D transformations and generate a matrix that can be applied, for instance, on a Canvas.
可以用来计算3D转换和用于生成矩阵,例如:Canvas


代码比较简单

public class CameraDemoActivity extends Activity implements OnSeekBarChangeListener {// ===========================================================// Constants// ===========================================================// ===========================================================// Fields// ===========================================================private Camera mCamera;private ImageView mImageView;// ===========================================================// Constructors// ===========================================================// ===========================================================// Public Methods// ===========================================================// ===========================================================// Methods for/from SuperClass/Interfaces// ===========================================================@Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                // 创建Camera实例        mCamera = new Camera();                // 获取控制控件        SeekBar seekBarRotateX = (SeekBar) findViewById(R.id.seekBar1);        SeekBar seekBarRotateY = (SeekBar) findViewById(R.id.seekBar2);        SeekBar seekBarRotateZ = (SeekBar) findViewById(R.id.seekBar3);        SeekBar seekBarSkewX = (SeekBar) findViewById(R.id.seekBar4);        SeekBar seekBarSkewY = (SeekBar) findViewById(R.id.seekBar5);        SeekBar seekBarTranslateX = (SeekBar) findViewById(R.id.seekBar6);        SeekBar seekBarTranslateY = (SeekBar) findViewById(R.id.seekBar7);        SeekBar seekBarTranslateZ = (SeekBar) findViewById(R.id.seekBar8);                seekBarRotateX.setOnSeekBarChangeListener(this);        seekBarRotateY.setOnSeekBarChangeListener(this);        seekBarRotateZ.setOnSeekBarChangeListener(this);        seekBarSkewX.setOnSeekBarChangeListener(this);        seekBarSkewY.setOnSeekBarChangeListener(this);        seekBarTranslateX.setOnSeekBarChangeListener(this);        seekBarTranslateY.setOnSeekBarChangeListener(this);        seekBarTranslateZ.setOnSeekBarChangeListener(this);                mImageView = (ImageView) findViewById(R.id.imageView1);                rotate(0, 0, 0);    }@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {switch (seekBar.getId()) {case R.id.seekBar1:rotate(progress, 0, 0);break;case R.id.seekBar2:rotate(0, progress, 0);break;case R.id.seekBar3:rotate(0, 0, progress);break;case R.id.seekBar4:skew((progress - 100) * 1.0f / 100, 0);break;case R.id.seekBar5:skew(0, (progress - 100) * 1.0f / 100);break;case R.id.seekBar6:translate(progress - 100, 0, 0);break;case R.id.seekBar7:translate(0, progress - 100, 0);break;case R.id.seekBar8:translate(0, 0, progress - 100);break;}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}// ===========================================================// Private Methods// ===========================================================/** * 根据SeekBar操作,使用Camera操作刷新图片 *  * @param pRotateX * @param pRotateY * @param pRotateZ */private void rotate(int pRotateX, int pRotateY, int pRotateZ) {// 获取处理图片BitmapDrawable drawable = (BitmapDrawable) getResources().getDrawable(R.drawable.ic_launcher);Bitmap bitmap = drawable.getBitmap();// 记录一下初始状态。save()和restore()可以将图像过渡得柔和一些。mCamera.save();// 旋转mCamera.rotateX(pRotateX);mCamera.rotateY(pRotateY);mCamera.rotateZ(pRotateZ);Matrix matrix = new Matrix();// 计算相应的电流变换矩阵,并把它复制到所提供的矩阵对象。mCamera.getMatrix(matrix);// 恢复之前状态mCamera.restore();// 设置图像处理的中心点. 此对象的创建操作,必须在camera的save和restore方法中间.matrix.preTranslate(bitmap.getWidth()>> 1, bitmap.getHeight() >>1 );// 生成新的BitmapBitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);// 绑定到ImageViewif (newBitmap != null) {mImageView.setImageBitmap(newBitmap);}}private void skew(float skewX, float skewY) {BitmapDrawable drawable = (BitmapDrawable) getResources().getDrawable(R.drawable.ic_launcher);Bitmap bitmap = drawable.getBitmap();mCamera.save();Matrix matrix = new Matrix();mCamera.getMatrix(matrix);mCamera.restore();matrix.preTranslate(bitmap.getWidth()>> 1, bitmap.getHeight() >>1 );matrix.preSkew(skewX, skewY);        // matrix.postSkew(skewX, skewY);        // 直接setSkew(),则前面处理的rotate()、translate()等等都将无效。        // matrix.setSkew(skewX, skewY);Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);if (newBitmap != null) {mImageView.setImageBitmap(newBitmap);}}private void translate(int translateX, int translateY, int translateZ) {BitmapDrawable drawable = (BitmapDrawable) getResources().getDrawable(R.drawable.ic_launcher);Bitmap bitmap = drawable.getBitmap();mCamera.save();// translatemCamera.translate(translateX, translateY, translateZ);Matrix matrix = new Matrix();mCamera.getMatrix(matrix);mCamera.restore();matrix.preTranslate(bitmap.getWidth()>> 1, bitmap.getHeight() >>1 );Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);if (newBitmap != null) {mImageView.setImageBitmap(newBitmap);}}// ===========================================================// Inner and Anonymous Classes// ===========================================================}


疑问

1. 为什么设置完Camera后还需要设置Matrix?

2. translateX 与 translateY设置什么没有反应?


参考资料:[Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜



原创粉丝点击