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实现图像的倾斜
- Android Camera控制图旋转、倾斜 - 可用于实现伪3D效果
- Camera 3D旋转效果
- android camera 实现3d效果
- Android实现3D旋转效果
- android 实现3D动画旋转效果
- android实现3D旋转效果
- Android实现3D旋转效果
- 利用Android的Camera类实现3D旋转功能
- Android Camera 3D效果
- Android Camera 3D效果
- Android Camera 3D效果
- Android Camera 3D效果
- android 用camera实现3D效果
- android.graphics.Camera 实现简单的3D效果
- [Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜
- [Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜
- 自定义控件Camera+Matrix实现3D旋转及百叶窗效果(雷惊风)
- android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜
- 365. Proverbs are the daughers of daily experience. 谚语是日常生活的结晶
- 周赛 Hd2270+总结改进
- oracle心得2--单行函数理论讲解与案例分析.doc
- hdu 1181 (搜索BFS,深搜DFS,并查集)
- Log4j基础讲解
- Android Camera控制图旋转、倾斜 - 可用于实现伪3D效果
- 为什么长达66分钟的阅兵式上我们都捕捉到了那短暂的一秒(转)
- 【Android】将apk文件安装到Android模拟器中
- 找出直系亲属
- GDI+奇怪的地方
- 《富爸爸、穷爸爸》精华摘要
- A. Postcards and photos
- 人一生当中最应该珍惜的十种人
- 深入理解C语言指针的奥秘(转载)