在Android开发应用中,图片浏览功能的使用很广泛,由于一些特殊要求,由于手机屏幕大小比较局限性,所以需要对图片的放大、缩小,还有能够拖动来浏览,这样就产生一个问题:第一次做一个图片浏览功能的时候发现:图片是放大了但是会图片放大超过屏幕以后会自动被切掉,就是移动以后也看不到被切的部分了,那该怎么办呢,总不能就这么放弃了吧,后来想到了一个办法,拖动后重新生成图片,以保证能够在屏幕显示想要的图片区域。在这里分享一下这个功能的实现:
1.创建一个View
public class Zoom extends View{
Bitmap mBitQQ = null;
int BitQQwidth = 0;
int BitQQheight = 0;
float Scale = 0.7f;
float step = 0.02f;
Matrix mMatrix = new Matrix();
int rx=0;
int ry=0;
public Zoom(Context context,Bitmap first){
super(context);
mBitQQ = first;
BitQQwidth = mBitQQ.getWidth();
BitQQheight = mBitQQ.getHeight();
setFocusable(true);
}
public void setimg(Bitmap mBit){
mBitQQ = mBit;
BitQQwidth = mBitQQ.getWidth();
BitQQheight = mBitQQ.getHeight();
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
mMatrix.reset();
mMatrix.postScale(Scale,Scale);
if(rx<0) rx =0;
if(ry<0) ry =0;
if(rx>BitQQwidth-10) rx=BitQQwidth-10;
if(ry>BitQQheight-10) ry=BitQQheight-10;
Bitmap mBitQQ2 = Bitmap.createBitmap(mBitQQ, rx, ry, BitQQwidth-rx,BitQQheight-ry, mMatrix, true);
canvas.drawBitmap(mBitQQ2, 0, 0, null);
mBitQQ2 = null;
}
//放大
public void setbig(){
if(Scale<2.0) Scale+=step;
invalidate();
}
//缩小
public void setsmall(){
if(Scale>0.2) Scale-=step;
invalidate();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_DPAD_UP)
{
setbig();
}
if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN)
{
setsmall();
}
if(keyCode==KeyEvent.KEYCODE_DPAD_RIGHT)
{
setbig();
}
if(keyCode==KeyEvent.KEYCODE_DPAD_LEFT)
{
setsmall();
}
return true;
}
int lastX=0, lastY=0;
//拖动功能
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getX();
lastY = (int) event.getY();
Log.v("log","las="+lastX);
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getX() - lastX;
int dy = (int) event.getY() - lastY;
rx -=dx;
ry -=dy;
lastX = (int) event.getX();
lastY = (int) event.getY();
break;
case MotionEvent.ACTION_UP:
lastX = (int) event.getX();
lastY = (int) event.getX();
break;
case MotionEvent.ACTION_OUTSIDE:
//lastX = (int) event.getRawX();
//lastY = (int) event.getRawY();
break;
}
invalidate();
return true;
}
}
2.调用view
public class imageview extends Activity{
private Zoom imgzoom;
private Button bigbtn;
private Button smallbtn;
private Button prebtn;
private Button nextbtn;
private Bitmap currentBmp;
private ArrayList<String> filelist;
private String listid="112";
private int maxid = 1;
private int currentid=0;
private Bitmap tempbmp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.imgview);
bigbtn = (Button)findViewById(R.id.so_big);
smallbtn = (Button)findViewById(R.id.so_small);
//默认图片
tempbmp = ((BitmapDrawable) getResources().getDrawable(R.drawable.a_12)).getBitmap();
currentBmp = savemsg.getBitmap(“图片地址”, tempbmp);
imgzoom = new Zoom(this,currentBmp);
LinearLayout adViewLayout = (LinearLayout) findViewById(R.id.imgview);
adViewLayout.addView(imgzoom,
new LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
bigbtn.setOnClickListener(bigaction);
smallbtn.setOnClickListener(smallaction);
}
View.OnClickListener bigaction = new OnClickListener(){
public void onClick(View v) {
imgzoom.setbig();
}
};
View.OnClickListener smallaction = new OnClickListener(){
public void onClick(View v) {
imgzoom.setsmall();
}
};
}