view类:
/**
* 图像选取类,可以拖拽截取指定区域的图像.
*
* @author hhf
*/
package com.PicRect;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;public class RectImageView extends View{
float DownX,DownY,NowX,NowY;
boolean isFigureLeave = true;
boolean isSelected = false;
Paint paint;
Bitmap bmp_BG;
OnImageSelectedListener Listener = null;public RectImageView(Context context){
super(context);
Init();
}
public RectImageView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
Init();
}private void Init(){
paint = new Paint();
paint.setARGB(128, 255, 0, 0);
DownX = DownY = NowX = NowY = 0;
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if(bmp_BG!=null)
canvas.drawBitmap(bmp_BG,0,0,paint);
else
canvas.drawText("No Bitmap!", 0, 0, paint);
if(DownX!=NowX)
DrawRect(canvas);
}@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
float x = event.getX();
float y = event.getY();
switch(event.getAction()){
case MotionEvent.ACTION_MOVE:
if(x<0)
x = 0;
if(y<0)
y = 0;
NowX = x<bmp_BG.getWidth()?x:bmp_BG.getWidth();
NowY = y<bmp_BG.getHeight()?y:bmp_BG.getHeight();
break;
case MotionEvent.ACTION_UP:
isFigureLeave = true;
if(Listener != null)
{
Listener.OnImageSelected(GetRectBitmap());
}
isSelected = true;
break;
case MotionEvent.ACTION_DOWN:
isFigureLeave = false;
DownX = NowX = x<bmp_BG.getWidth()?x:bmp_BG.getWidth();
DownY = NowY = y<bmp_BG.getHeight()?y:bmp_BG.getHeight();
break;
}
invalidate();
return true;
}
private void DrawRect(Canvas canvas){
canvas.drawLine(DownX, DownY, DownX, NowY, paint);
canvas.drawLine(DownX, DownY, NowX, DownY, paint);
canvas.drawLine(NowX, NowY, DownX, NowY, paint);
canvas.drawLine(NowX, NowY, NowX, DownY, paint);
return;
}
private Bitmap GetRectBitmap(){
int x,y,w,h;
x = (int) (DownX>NowX?NowX:DownX);
y = (int) (DownY>NowY?NowY:DownY);
w = Math.abs((int)(DownX - NowX));
h = Math.abs((int)(DownY - NowY));
if(w>0&&h>0)
return Bitmap.createBitmap(bmp_BG, x, y, w, h);
else
return null;
}
/*************************************************************************/
/**
* 设置画笔颜色
*
* @param 要设置的画笔
*/
public void SetPaint(Paint paint){
this.paint = paint;
return;
}
/**
* 设置要选取的图像
*
*@param 欲被选取的Bitmap
*/
public void SetBitmap(Bitmap bm){
this.bmp_BG = bm;
invalidate();
}
/**
* 获取选取的图像
* @return 返回当前选取的图像,若没有选取范围则返回null
*/
public Bitmap GetSelectBitmap(){
if(isSelected)
return GetRectBitmap();
else
return null;
}
/**
* 清除选定区域(重置)
*/
public void ResetSelectRect(){
isSelected = false;
DownX = DownY = NowX = NowY = 0;
invalidate();
}
/**
* 设置选择监听器
* @param l
*/
public void SetOnImageSelectedListener(OnImageSelectedListener l){
Listener = l;
}
}
OnImageSelectedListener:
/**
* 图像选取接口类
* @author hhf
*/
package com.PicRect;import android.graphics.Bitmap;
public interface OnImageSelectedListener{
/**
* 当图像选取动作完成后被调用
* @param bitmap
*/
abstract void OnImageSelected(Bitmap bitmap);
}
activity:
/**
* 图像选取demo.
*
* @author hhf
*
*/
package com.PicRect;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;public class Main extends Activity implements OnImageSelectedListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.main);
RectImageView RIV = (RectImageView)findViewById(R.id.RIV);Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test);
RIV.SetBitmap(bm);
RIV.SetOnImageSelectedListener(this);
}@Override
public void OnImageSelected(Bitmap bitmap) {
// TODO Auto-generated method stub
ImageView IV = (ImageView)findViewById(R.id.IV);
IV.setImageBitmap(bitmap);
}
}
xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
<ImageView
android:id="@+id/IV"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<com.PicRect.RectImageView
android:id="@+id/RIV"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>