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
代码比较简单
疑问
1. 为什么设置完Camera后还需要设置Matrix?
2. translateX 与 translateY设置什么没有反应?
参考资料:[Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜
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实现图像的倾斜
相关文章推荐
- CSS3 3D效果 实现一个可旋转的正方体
- 纯JS实现旋转图片3D展示效果
- css3平移、旋转、倾斜、缩放、动画效果的实现
- 自定义控件Camera+Matrix实现3D旋转及百叶窗效果(雷惊风)
- 运用css3 实现骰子3d旋转效果
- 【Android界面实现】可旋转的汽车3D模型效果的实现
- 具有3D旋转效果的图片组的一种实现
- 纯JS实现旋转图片3D展示效果
- AS3.0 Bitmap类实现图片3D旋转效果
- css3实现超立体3D图片侧翻倾斜效果
- Android 3D旋转动画效果实现分解
- jQuery实现炫丽的3d旋转星空效果
- [置顶] Android 3D立体旋转效果实现
- 纯css样式实现盒子 3D 旋转、鼠标悬停效果
- 实现图片旋转木马3D浏览效果
- 具有3D旋转效果的图片组的一种实现
- JavaScrip实现3D旋转动态效果
- [Unity3d]3D车展之汽车开门关门和旋转缩放的效果的实现
- css3 js实现3D旋转效果
- 具有3D旋转效果的图片组的一种实现