阅读更多

今天下载传智播客黎活明老师的Android视频看了图片拖动和缩放,放上去以后学习用。

package com.example.test_pictrue_move_drag;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.graphics.PointF;import android.os.Bundle;import android.util.FloatMath;import android.view.MotionEvent;import android.view.View;import android.widget.ImageView;public class MainActivity extends Activity {private ImageView imageView ;private PointF startPoint = new PointF();private Matrix matrix = new Matrix() ;private Matrix saveCurrentMatrix = new Matrix();// 初始状态  private  final static int NONE = 0;// 拖动  private  final static int DRAG = 1;// 缩放  private  final static int ZOOM = 2;// 记录当前模式private int MODE = NONE ;// 计算两点之间的距离private float startDistance ;// 计算两点之间的中心点private PointF midPoint ;// private Bitmap bitmap ;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView) findViewById(R.id.imageView);imageView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubswitch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN: // 手指按下屏幕saveCurrentMatrix.set(imageView.getImageMatrix()); // 记录imageView的当前移动位置startPoint.set(event.getX(), event.getY()); // 记录开始按下的点坐标MODE = DRAG ;break;case MotionEvent.ACTION_POINTER_DOWN: // 屏幕上已经有一个触点,再有一个手指按下屏幕MODE = ZOOM ;startDistance = distance(event);if(startDistance > 10f){midPoint = mid(event);saveCurrentMatrix.set(imageView.getImageMatrix());//记录ImageView当前的缩放倍数}break ;case MotionEvent.ACTION_MOVE:if(MODE == DRAG ){// 移动距离float dx = event.getX() - startPoint.x;float dy = event.getY() - startPoint.y;matrix.set(saveCurrentMatrix); //在上一次移动位置的基础上进行移动// 进行拖动matrix.postTranslate(dx, dy);} else if (MODE == ZOOM){float endDis = distance(event);//结束距离if(endDis > 10f){float scale = endDis / startDistance;//得到缩放倍数matrix.set(saveCurrentMatrix);//在上一次缩放位置的基础上进行缩放matrix.postScale(scale, scale, midPoint.x, midPoint.y);}}break ;case MotionEvent.ACTION_UP:// 手指离开屏幕case MotionEvent.ACTION_POINTER_UP: // 有手指离开屏幕,但还屏幕还有触点MODE = NONE ;break;}imageView.setImageMatrix(matrix);return true;}});//bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_20150119100930);}/**     * 计算两点之间的距离     * @param event     * @return     */public static float distance(MotionEvent event) {float dx = event.getX(1) - event.getX(0);float dy = event.getY(1) - event.getY(0);return FloatMath.sqrt(dx*dx + dy*dy);}/** * 计算两点之间的中间点 * @param event * @return */public static PointF mid(MotionEvent event){float midX = (event.getX(1) + event.getX(0)) / 2;float midY = (event.getY(1) + event.getY(0)) / 2;return new PointF(midX, midY);}///** //     * 横向、纵向居中 //     */  //    protected void center(boolean horizontal, boolean vertical) { //        Matrix m = new Matrix();  //        m.set(matrix);  //        RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());  //        m.mapRect(rect);  //        float height = rect.height();  //        float width = rect.width();  //        float deltaX = 0, deltaY = 0;  //        if (vertical) {  //            // 图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下放留空则往下移  //            int screenHeight = getResources().getDisplayMetrics().heightPixels;  //            if (height < screenHeight) {  //                deltaY = (screenHeight - height) / 2 - rect.top;  //            } else if (rect.top > 0) {  //                deltaY = -rect.top;  //            } else if (rect.bottom < screenHeight) {  //                deltaY = imageView.getHeight() - rect.bottom;  //            }  //        }  //        if (horizontal) {  //            int screenWidth = getResources().getDisplayMetrics().widthPixels;  //            if (width < screenWidth) {  //                deltaX = (screenWidth - width) / 2 - rect.left;  //            } else if (rect.left > 0) {  //                deltaX = -rect.left;  //            } else if (rect.right < screenWidth) {  //                deltaX = screenWidth - rect.right;  //            }  //        }  //        matrix.postTranslate(deltaX, deltaY);  //    }  }

 

    xml

      

 

   附件还有一个另一种拖动的实现方式

 

  • Test_pictrue_move_drag.rar (2.3 MB)
  • 下载次数: 2
  • Test_pictrue_move.rar (1.6 MB)
  • 下载次数: 2

更多相关文章

  1. Android(安卓)拖动换图特效
  2. 关于android原生Webview的一些属性整理(持续补充~)
  3. android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )屏幕适配
  4. android 之绘图
  5. android:configChanges="keyboard|keyboardHidden|orientation|s
  6. Android(安卓)UI
  7. ListView取消和自定义分割线的方法
  8. android 强制竖屏
  9. android 横向滚动屏幕实现(3)

随机推荐

  1. 浅谈踢人下线的设计思路!(附代码实现方案)
  2. 深入探索Redis的五种基础数据类型
  3. C语言学习笔记 第三天
  4. KMP算法的JAVA实现
  5. 太赞了!机器学习基础核心算法:贝叶斯分类!(
  6. 原子操作是如何实现的?
  7. Docker学习笔记:(1)Docker基础知识
  8. 用sa-token轻松解决网站权限验证
  9. Java中的 Switch 是如何支持 String 的?为
  10. sa-token v1.8.0 版本已发布,带来大量激动