初步学习Camera与Matrix


  1. Camera的rotate()相关方法是指定某一维度上旋转指定的角度。
  2. Matrix的rotate()相关方法实现的效果是顺时针旋转指定的角度;与Camera指定Z轴旋转效果相同,但方向相反。
  3. Camera的translate()方法根据某一维度上视点的位移实现图像的缩放,与Matrix的scale()相关方法作用效果相似,只是Matrix的scale()相关方法是直接指定缩放比例。
  4. Camera不支持倾斜操作,Matrix可以直接实现倾斜操作。

本文为练习Camera的使用。实现效果图如下:

Camera的处理结果只是生成一个Matrix,该Matrix用于Bitmap或Canvas绘制Bitmap时才能产生旋转或缩放的效果。

代码如下:

001 package lab.sodino.camera;
002   
003 import android.app.Activity;
004 import android.graphics.Bitmap;
005 import android.graphics.Camera;
006 import android.graphics.Matrix;
007 import android.graphics.drawable.BitmapDrawable;
008 import android.os.Bundle;
009 import android.util.Log;
010 import android.widget.ImageView;
011 import android.widget.SeekBar;
012 import android.widget.SeekBar.OnSeekBarChangeListener;
013 import android.widget.TextView;
014   
015 /**
016  * Camera与Matrix的比较:<br/>
017  * Camera的rotate()相关方法是指定某一维度上旋转指定的角度。<br/>
018  * Matrix的rotate()相关方法实现的效果是顺时针旋转指定的角度;与Camera指定Z轴旋转效果相同,但方向相反。<br/>
019  *
020  * Camera的translate()方法根据某一维度上视点的位移实现图像的缩放,与Matrix的scale()相关方法作用效果相似,
021  * 只是Matrix的scale()相关方法是直接指定缩放比例。<br/>
022  *
023  * Camera不支持倾斜操作,Matrix可以直接实现倾斜操作。<br/>
024  *
025  * <a href="http://my.oschina.net/arthor" class="referer" target="_blank">@author</a> Sodino E-mail:sodinoopen@hotmail.com
026  * @version Time:2011-9-26 下午04:17:49
027  */
028 public class ActCamera extends Activity implements OnSeekBarChangeListener {
029     private Camera camera;
030     // views
031     private SeekBar seekbarXRotate;
032     private SeekBar seekbarYRotate;
033     private SeekBar seekbarZRotate;
034     private TextView txtXRotate;
035     private TextView txtYRotate;
036     private TextView txtZRotate;
037     private SeekBar seekbarXSkew;
038     private SeekBar seekbarYSkew;
039     private SeekBar seekbarZTranslate;
040     private TextView txtXTranslate;
041     private TextView txtYTranslate;
042     private TextView txtZTranslate;
043     private ImageView imgResult;
044     // integer params
045     private int rotateX, rotateY, rotateZ;
046     private float skewX, skewY;
047     private int translateZ;
048   
049     /** Called when the activity is first created. */
050     @Override
051     public void onCreate(Bundle savedInstanceState) {
052         super.onCreate(savedInstanceState);
053         setContentView(R.layout.main);
054         // camera
055         camera = new Camera();
056         // initViews
057         // rotate
058         seekbarXRotate = (SeekBar) findViewById(R.id.seekbarXRotate);
059         seekbarXRotate.setOnSeekBarChangeListener(this);
060         seekbarYRotate = (SeekBar) findViewById(R.id.seekbarYRotate);
061         seekbarYRotate.setOnSeekBarChangeListener(this);
062         seekbarZRotate = (SeekBar) findViewById(R.id.seekbarZRotate);
063         seekbarZRotate.setOnSeekBarChangeListener(this);
064         txtXRotate = (TextView) findViewById(R.id.txtXRotate);
065         txtYRotate = (TextView) findViewById(R.id.txtYRotate);
066         txtZRotate = (TextView) findViewById(R.id.txtZRotate);
067         // translate
068         seekbarXSkew = (SeekBar) findViewById(R.id.seekbarXSkew);
069         seekbarXSkew.setOnSeekBarChangeListener(this);
070         seekbarYSkew = (SeekBar) findViewById(R.id.seekbarYSkew);
071         seekbarYSkew.setOnSeekBarChangeListener(this);
072         seekbarZTranslate = (SeekBar) findViewById(R.id.seekbarZTranslate);
073         seekbarZTranslate.setOnSeekBarChangeListener(this);
074         txtXTranslate = (TextView) findViewById(R.id.txtXSkew);
075         txtYTranslate = (TextView) findViewById(R.id.txtYSkew);
076         txtZTranslate = (TextView) findViewById(R.id.txtZTranslate);
077         imgResult = (ImageView) findViewById(R.id.imgResult);
078         // refresh
079         refreshImage();
080     }
081   
082     private void refreshImage() {
083         // 获取待处理的图像
084         BitmapDrawable tmpBitDra = (BitmapDrawable) getResources().getDrawable(R.drawable.honeycomb);
085         Bitmap tmpBit = tmpBitDra.getBitmap();
086         // 开始处理图像
087         // 1.获取处理矩阵
088         // 记录一下初始状态。save()和restore()可以将图像过渡得柔和一些。
089         // Each save should be balanced with a call to restore().
090         camera.save();
091         Matrix matrix = new Matrix();
092         // rotate
093         camera.rotateX(rotateX);
094         camera.rotateY(rotateY);
095         camera.rotateZ(rotateZ);
096         // translate
097         camera.translate(00, translateZ);
098         camera.getMatrix(matrix);
099         // 恢复到之前的初始状态。
100         camera.restore();
101         // 设置图像处理的中心点
102         matrix.preTranslate(tmpBit.getWidth() >> 1, tmpBit.getHeight() >> 1);
103         matrix.preSkew(skewX, skewY);
104         // matrix.postSkew(skewX, skewY);
105         // 直接setSkew(),则前面处理的rotate()、translate()等等都将无效。
106         // matrix.setSkew(skewX, skewY);
107         // 2.通过矩阵生成新图像(或直接作用于Canvas)
108         Log.d(“ANDROID_LAB”, “width=” + tmpBit.getWidth() + “ height=” + tmpBit.getHeight());
109         Bitmap newBit = null;
110         try {
111             // 经过矩阵转换后的图像宽高有可能不大于0,此时会抛出IllegalArgumentException
112             newBit = Bitmap.createBitmap(tmpBit, 00, tmpBit.getWidth(), tmpBit.getHeight(), matrix, true);
113         catch (IllegalArgumentException iae) {
114             iae.printStackTrace();
115         }
116         if (newBit != null) {
117             imgResult.setImageBitmap(newBit);
118         }
119     }
120   
121     @Override
122     public void onProgressChanged(SeekBar seekBar, int progress, booleanfromUser) {
123         if (seekBar == seekbarXRotate) {
124             txtXRotate.setText(progress + “゜”);
125             rotateX = progress;
126         else if (seekBar == seekbarYRotate) {
127             txtYRotate.setText(progress + “゜”);
128             rotateY = progress;
129         else if (seekBar == seekbarZRotate) {
130             txtZRotate.setText(progress + “゜”);
131             rotateZ = progress;
132         else if (seekBar == seekbarXSkew) {
133             skewX = (progress - 100) * 1.0f / 100;
134             txtXTranslate.setText(String.valueOf(skewX));
135         else if (seekBar == seekbarYSkew) {
136             skewY = (progress - 100) * 1.0f / 100;
137             txtYTranslate.setText(String.valueOf(skewY));
138         else if (seekBar == seekbarZTranslate) {
139             translateZ = progress - 100;
140             txtZTranslate.setText(String.valueOf(translateZ));
141         }
142         refreshImage();
143     }
144   
145     @Override
146     public void onStartTrackingTouch(SeekBar seekBar) {
147   
148     }
149   
150     @Override
151     public void onStopTrackingTouch(SeekBar seekBar) {
152   
153     }
154 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值