android.graphics.Camera可以對(duì)圖像執(zhí)行一些比較復(fù)雜的操作,諸如旋轉(zhuǎn)與綻放。
本文為練習(xí)Camera的使用。實(shí)現(xiàn)效果圖如下:
Camera的處理結(jié)果只是生成一個(gè)Matrix,該Matrix用于Bitmap或Canvas繪制Bitmap時(shí)才能產(chǎn)生旋轉(zhuǎn)或縮放的效果。
代碼如下:- package lab.sodino.camera;
- import android.app.Activity;
- import android.graphics.Bitmap;
- import android.graphics.Camera;
- import android.graphics.Matrix;
- import android.graphics.drawable.BitmapDrawable;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.ImageView;
- import android.widget.SeekBar;
- import android.widget.SeekBar.OnSeekBarChangeListener;
- import android.widget.TextView;
- /**
- * @author Sodino E-mail:sodinoopen@hotmail.com
- * @version Time:2011-9-26 下午04:17:49
- */
- public class ActCamera extends Activity implements OnSeekBarChangeListener {
- private Camera camera;
- // views
- private SeekBar seekbarXRotate;
- private SeekBar seekbarYRotate;
- private SeekBar seekbarZRotate;
- private TextView txtXRotate;
- private TextView txtYRotate;
- private TextView txtZRotate;
- private SeekBar seekbarXTranslate;
- private SeekBar seekbarYTranslate;
- private SeekBar seekbarZTranslate;
- private TextView txtXTranslate;
- private TextView txtYTranslate;
- private TextView txtZTranslate;
- private ImageView imgResult;
- // integer params
- private int rotateX, rotateY, rotateZ;
- private int translateX, translateY, translateZ;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // camera
- camera = new Camera();
- // initViews
- // rotate
- seekbarXRotate = (SeekBar) findViewById(R.id.seekbarXRotate);
- seekbarXRotate.setOnSeekBarChangeListener(this);
- seekbarYRotate = (SeekBar) findViewById(R.id.seekbarYRotate);
- seekbarYRotate.setOnSeekBarChangeListener(this);
- seekbarZRotate = (SeekBar) findViewById(R.id.seekbarZRotate);
- seekbarZRotate.setOnSeekBarChangeListener(this);
- txtXRotate = (TextView) findViewById(R.id.txtXRotate);
- txtYRotate = (TextView) findViewById(R.id.txtYRotate);
- txtZRotate = (TextView) findViewById(R.id.txtZRotate);
- // translate
- seekbarXTranslate = (SeekBar) findViewById(R.id.seekbarXTranslate);
- seekbarXTranslate.setOnSeekBarChangeListener(this);
- seekbarYTranslate = (SeekBar) findViewById(R.id.seekbarYTranslate);
- seekbarYTranslate.setOnSeekBarChangeListener(this);
- seekbarZTranslate = (SeekBar) findViewById(R.id.seekbarZTranslate);
- seekbarZTranslate.setOnSeekBarChangeListener(this);
- txtXTranslate = (TextView) findViewById(R.id.txtXTranslate);
- txtYTranslate = (TextView) findViewById(R.id.txtYTranslate);
- txtZTranslate = (TextView) findViewById(R.id.txtZTranslate);
- imgResult = (ImageView) findViewById(R.id.imgResult);
- // refresh
- refreshImage();
- }
- private void refreshImage() {
- // 獲取待處理的圖像
- BitmapDrawable tmpBitDra = (BitmapDrawable) getResources().getDrawable(R.drawable.honeycomb);
- Bitmap tmpBit = tmpBitDra.getBitmap();
- // 開(kāi)始處理圖像
- // 1.獲取處理矩陣
- // 記錄一下初始狀態(tài)。save()和restore()可以將圖像過(guò)渡得柔和一些。
- // Each save should be balanced with a call to restore().
- camera.save();
- Matrix matrix = new Matrix();
- // rotate
- camera.rotateX(rotateX);
- camera.rotateY(rotateY);
- camera.rotateZ(rotateZ);
- // translate
- camera.translate(translateX, translateY, translateZ);
- camera.getMatrix(matrix);
- // 恢復(fù)到之前的初始狀態(tài)。
- camera.restore();
- // 設(shè)置圖像處理的中心點(diǎn)
- matrix.preTranslate(tmpBit.getWidth() >> 1, tmpBit.getHeight() >> 1);
- // 2.通過(guò)矩陣生成新圖像(或直接作用于Canvas)
- Log.d("ANDROID_LAB", "width=" + tmpBit.getWidth() + " height=" + tmpBit.getHeight());
- Bitmap newBit = null;
- try {
- // 經(jīng)過(guò)矩陣轉(zhuǎn)換后的圖像寬高有可能不大于0,此時(shí)會(huì)拋出IllegalArgumentException
- newBit = Bitmap.createBitmap(tmpBit, 0, 0, tmpBit.getWidth(), tmpBit.getHeight(), matrix, true);
- } catch (IllegalArgumentException iae) {
- iae.printStackTrace();
- }
- if (newBit != null) {
- imgResult.setImageBitmap(newBit);
- }
- }
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- if (seekBar == seekbarXRotate) {
- txtXRotate.setText(progress + "゜");
- rotateX = progress;
- } else if (seekBar == seekbarYRotate) {
- txtYRotate.setText(progress + "゜");
- rotateY = progress;
- } else if (seekBar == seekbarZRotate) {
- txtZRotate.setText(progress + "゜");
- rotateZ = progress;
- } else if (seekBar == seekbarXTranslate) {
- translateX = progress - 100;
- txtXTranslate.setText(String.valueOf(translateX));
- } else if (seekBar == seekbarYTranslate) {
- translateY = progress - 100;
- txtYTranslate.setText(String.valueOf(translateY));
- } else if (seekBar == seekbarZTranslate) {
- translateZ = progress - 100;
- txtZTranslate.setText(String.valueOf(translateZ));
- }
- refreshImage();
- }
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- }
- }
|