android图片平滑缩放原理,android 大图片拖拽并缩放实现原理

android 大图片拖拽并缩放实现原理

发布:whsnow 字体:[增加 减小] 类型:转载

android 大图片拖拽缩放有利于用户体验,在开发过程中经常使用到,这篇图片拖拽缩放也是我在项目中用到的,今天整理一下,将源码奉献给大家,希望对大家以后碰到相似的问题有帮助

由于最近项目忙,博客一直没有时间更新,今天有点时间就连续更新两篇吧,过过瘾。

这篇图片拖拽缩放也是我在项目中用到的,今天整理一下,将源码奉献给大家,希望对大家以后碰到相似的问题有帮助。

这篇就不做过多介绍了,直接上源码:

复制代码 代码如下:

public class SpacePageActivity extends Activity {

private LinearLayout linnerLayout_spacepage;

private RelativeLayout relativeLayout_spacepage;

private Button btn_spacepage_back;

private Button btn_spacepage_save;

private static Boolean isTrue=false;

private static String IMAGE_MIME_TYPE ;

private ImageView image_spacePage;

private ProgressDialog dialog;

private Bitmap bitmap;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题

setContentView(R.layout.spacepage);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

initHead();

if(isNetworkAvailable()){

image_spacePage=(ImageView) findViewById(R.id.image_spacepage);

btn_spacepage_save=(Button) findViewById(R.id.btn_spacepage_save);

image_spacePage.setOnTouchListener(new MulitPointTouchListener(image_spacePage));

image_spacePage.setScaleType(ScaleType.CENTER_INSIDE);

//加载成功

String urls="http://epaper.yzdsb.com.cn/201201/04/yz2104_7.jpg";

bitmap=returnBitMap(urls);

if(null!=bitmap){

image_spacePage.setImageBitmap(bitmap);

}

}

}

public Bitmap returnBitMap(String url) {

if(null==url || "".equals(url)){

return null;

}

URL myFileUrl = null;

Bitmap bitmap = null;

try {

myFileUrl = new URL(url);

} catch (MalformedURLException e) {

e.printStackTrace();

}

try {

HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();

conn.setConnectTimeout(2000);

conn.setDoInput(true);

conn.connect();

InputStream is = conn.getInputStream();

bitmap = BitmapFactory.decodeStream(is);

is.close();

} catch (IOException e) {

e.printStackTrace();

}

return bitmap;

}

public class MulitPointTouchListener implements OnTouchListener {

Matrix matrix = new Matrix();

Matrix savedMatrix = new Matrix();

public ImageView image;

static final int NONE = 0;

static final int DRAG = 1;

static final int ZOOM = 2;

int mode = NONE;

PointF start = new PointF();

PointF mid = new PointF();

float oldDist = 1f;

public MulitPointTouchListener(ImageView image) {

super();

this.image = image;

}

@Override

public boolean onTouch(View v, MotionEvent event) {

this.image.setScaleType(ScaleType.MATRIX);

ImageView view = (ImageView) v;

// dumpEvent(event);

switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

Log.w("FLAG", "ACTION_DOWN");

matrix.set(view.getImageMatrix());

savedMatrix.set(matrix);

start.set(event.getX(), event.getY());

mode = DRAG;

break;

case MotionEvent.ACTION_POINTER_DOWN:

Log.w("FLAG", "ACTION_POINTER_DOWN");

oldDist = spacing(event);

if (oldDist > 10f) {

savedMatrix.set(matrix);

midPoint(mid, event);

mode = ZOOM;

}

break;

case MotionEvent.ACTION_UP:

Log.w("FLAG", "ACTION_UP");

case MotionEvent.ACTION_POINTER_UP:

Log.w("FLAG", "ACTION_POINTER_UP");

mode = NONE;

break;

case MotionEvent.ACTION_MOVE:

Log.w("FLAG", "ACTION_MOVE");

if (mode == DRAG) {

matrix.set(savedMatrix);

matrix.postTranslate(event.getX() - start.x, event.getY()

- start.y);

} else if (mode == ZOOM) {

float newDist = spacing(event);

if (newDist > 10f) {

matrix.set(savedMatrix);

float scale = newDist / oldDist;

matrix.postScale(scale, scale, mid.x, mid.y);

}

}

break;

}

view.setImageMatrix(matrix);

return true;

}

private float spacing(MotionEvent event) {

float x = event.getX(0) - event.getX(1);

float y = event.getY(0) - event.getY(1);

return FloatMath.sqrt(x * x + y * y);

}

private void midPoint(PointF point, MotionEvent event) {

float x = event.getX(0) + event.getX(1);

float y = event.getY(0) + event.getY(1);

point.set(x / 2, y / 2);

}

}

private void initHead() {

linnerLayout_spacepage = (LinearLayout) findViewById(R.id.linnerLayout_spacepage);

relativeLayout_spacepage=(RelativeLayout) findViewById(R.id.relativeLayout_spacepage);

btn_spacepage_back = (Button) findViewById(R.id.btn_spacepage_back);

btn_spacepage_back.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

finish();

}

});

btn_spacepage_save = (Button) findViewById(R.id.btn_spacepage_save);

}

protected boolean isNetworkAvailable() {

ConnectivityManager connectivity = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

if (connectivity == null) {

Log.i("NetWorkState", "Unavailabel");

return false;

} else {

NetworkInfo[] info = connectivity.getAllNetworkInfo();

if (info != null) {

for (int i = 0; i < info.length; i++) {

if (info[i].getState() == NetworkInfo.State.CONNECTED) {

Log.i("NetWorkState", "Availabel");

return true;

}

}

}

}

return false;

}

@Override

protected void onStop() {

// TODO Auto-generated method stub

if(bitmap!=null){

if(!bitmap.isRecycled()){

bitmap.recycle(); //回收图片所占的内存

bitmap=null;

System.gc(); //提醒系统及时回收

}

}

super.onStop();

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

if(bitmap!=null){

if(!bitmap.isRecycled()){

bitmap.recycle(); //回收图片所占的内存

bitmap=null;

System.gc(); //提醒系统及时回收

}

}

}

}

为是大图片,在onDestroy的时候要recycle掉,这样系统才会定时回收掉,System.gc();是提醒系统回收,虽然java这种垃圾回

收机制不用我们自己关心对象的回收,但是这也给android开发人员带来了不好的一面,如果系统回收不及时很可能就造成了内存溢出了。什么时候手机不担

心内存使用了就好了。

运行一下看看效果:

31867671_1.png

31867671_2.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值