您的位置:首页 > 移动开发 > Android开发

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

2013-04-05 08:58 1436 查看
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);
}

@Override
public 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;
}

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}

@Override
public 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 );

// 生成新的Bitmap
Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

// 绑定到ImageView
if (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();

// translate
mCamera.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实现图像的倾斜
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: