广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-05 08:32:38 次阅读 稿源:互联网
    广告

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

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

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

    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开发人员带来了不好的一面,如果系统回收不及时很可能就造成了内存溢出了。什么时候手机不担心内存使用了就好了。

    运行一下看看效果:

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告