Android手指绘图(一)
来源:互联网 发布:淘宝客服兼职在家的 编辑:程序博客网 时间:2024/04/27 16:29
package cn.c;import java.io.OutputStream;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.Bitmap.CompressFormat;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.net.Uri;import android.os.Bundle;import android.view.Display;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;/** * 注意: * 1 event.getX()和event.getRawX()方法的区别 * event.getX()是相对于父控件而言 * event.getRawX()是相对于屏幕左上角而言 * 2 在Activity中处理触摸事件采用的是OnTouchEvent() * 在View中处理触摸事件是实现OnTouchListener{}接口 * 覆写其中的onTouch()方法 * 3 Bug的问题: * 计算options.inSampleSize这里有Bug.有的图片过大在 * 设备图片库中是被旋转处理了的(虽然看上去没有).比如一 * 张大图片在图片库中看上去是竖屏的,但得到后在ImageView * 中显示却是横屏的. * 所以这里方便测试直接: * options.inSampleSize=8; * 写死了 * 4 调用bitmap.compress()方法的时候注意若设置格式为PNG,那么则无效. * 因为PNG将始终保持所有数据.JPEG是"有损的"编解码器 */public class MainActivity extends Activity implements OnTouchListener{ private ImageView mImageView; private Button mButton; private Button mSaveButton; private Bitmap mRawBitmap; private Bitmap mAlteredBitmap; private Paint mPaint; private Canvas mCanvas; private Uri mPhotoFileUri; private final int PICK=88; float downX=0; float downY=0; float upX=0; float upY=0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mImageView=(ImageView) findViewById(R.id.imageView); mImageView.setOnTouchListener(this); mButton=(Button) findViewById(R.id.button); mButton.setOnClickListener(new ButtonOnClickListener()); mSaveButton=(Button) findViewById(R.id.saveButton); mSaveButton.setOnClickListener(new ButtonOnClickListener()); mPaint=new Paint(); mPaint.setColor(Color.RED); mPaint.setStrokeWidth(5); } @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode==PICK) {mPhotoFileUri=data.getData();Display display=getWindowManager().getDefaultDisplay();float w=display.getWidth();float h=display.getHeight();try {BitmapFactory.Options options=new BitmapFactory.Options();options.inJustDecodeBounds=true;mRawBitmap=BitmapFactory.decodeStream (getContentResolver().openInputStream(mPhotoFileUri), null, options);int widthRation=(int) Math.ceil(options.outHeight/h);int heightRation=(int) Math.ceil(options.outWidth/w);if (heightRation>1&&widthRation>1) {if (heightRation>widthRation) {options.inSampleSize=heightRation;} else {options.inSampleSize=widthRation;}}//Bug所在:options.inSampleSize=8;options.inJustDecodeBounds=false;mRawBitmap=BitmapFactory.decodeStream (getContentResolver().openInputStream(mPhotoFileUri), null, options);mAlteredBitmap=Bitmap.createBitmap(mRawBitmap.getWidth(), mRawBitmap.getHeight(), mRawBitmap.getConfig());mCanvas=new Canvas(mAlteredBitmap);Matrix matrix=new Matrix();mCanvas.drawBitmap(mRawBitmap, matrix, mPaint);mImageView.setImageBitmap(mAlteredBitmap);} catch (Exception e) {}}}private class ButtonOnClickListener implements OnClickListener {public void onClick(View v) {switch (v.getId()) {case R.id.button:Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, PICK);break;case R.id.saveButton:try {if (mPhotoFileUri!=null) {OutputStream fos=getContentResolver().openOutputStream(mPhotoFileUri);mAlteredBitmap.compress(CompressFormat.JPEG, 90, fos);fos.close();Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_SHORT).show();}} catch (Exception e) {// TODO: handle exception}break;default:break;}}}public boolean onTouch(View v, MotionEvent event) {int action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN: downX=event.getX(); downY=event.getY();break;case MotionEvent.ACTION_MOVE:upX=event.getX(); upY=event.getY(); mCanvas.drawLine(downX, downY, upX, upY, mPaint); mImageView.invalidate(); downX=upX; downY=upY;break;case MotionEvent.ACTION_UP:// upX=event.getX();// upY=event.getY();// mCanvas.drawLine(downX, downY, upX, upY, mPaint);// mImageView.invalidate();break;case MotionEvent.ACTION_CANCEL:break;default:break;}return true;} }