Android自定义View之Layout的放缩(2)
来源:互联网 发布:淘宝店铺一心好做吗 编辑:程序博客网 时间:2024/06/01 09:20
只有一个子节点时可放缩的Framelayout,详细代码如下:
import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.ScaleGestureDetector;import android.view.View;import android.widget.FrameLayout; /** * Layout that provides pinch-zooming of content. This view should have exactly one child * view containing the content. */public class ZoomLayout extends FrameLayout implements ScaleGestureDetector.OnScaleGestureListener { private enum Mode { NONE, DRAG, ZOOM } private static final String TAG = "ZoomLayout"; private static final float MIN_ZOOM = 1.0f; private static final float MAX_ZOOM = 4.0f; private Mode mode = Mode.NONE; private float scale = 1.0f; private float lastScaleFactor = 0f; // Where the finger first touches the screen private float startX = 0f; private float startY = 0f; // How much to translate the canvas private float dx = 0f; private float dy = 0f; private float prevDx = 0f; private float prevDy = 0f; public ZoomLayout(Context context) { super(context); init(context); } public ZoomLayout(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public ZoomLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } private void init(Context context) { final ScaleGestureDetector scaleDetector = new ScaleGestureDetector(context, this); this.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: Log.i(TAG, "DOWN"); if (scale > MIN_ZOOM) { mode = Mode.DRAG; startX = motionEvent.getX() - prevDx; startY = motionEvent.getY() - prevDy; } break; case MotionEvent.ACTION_MOVE: if (mode == Mode.DRAG) { dx = motionEvent.getX() - startX; dy = motionEvent.getY() - startY; } break; case MotionEvent.ACTION_POINTER_DOWN: mode = Mode.ZOOM; break; case MotionEvent.ACTION_POINTER_UP: mode = Mode.DRAG; break; case MotionEvent.ACTION_UP: Log.i(TAG, "UP"); mode = Mode.NONE; prevDx = dx; prevDy = dy; break; } scaleDetector.onTouchEvent(motionEvent); if ((mode == Mode.DRAG && scale >= MIN_ZOOM) || mode == Mode.ZOOM) { getParent().requestDisallowInterceptTouchEvent(true); float maxDx = (child().getWidth() - (child().getWidth() / scale)) / 2 * scale; float maxDy = (child().getHeight() - (child().getHeight() / scale))/ 2 * scale; dx = Math.min(Math.max(dx, -maxDx), maxDx); dy = Math.min(Math.max(dy, -maxDy), maxDy); Log.i(TAG, "Width: " + child().getWidth() + ", scale " + scale + ", dx " + dx + ", max " + maxDx); applyScaleAndTranslation(); } return true; } }); } // ScaleGestureDetector @Override public boolean onScaleBegin(ScaleGestureDetector scaleDetector) { Log.i(TAG, "onScaleBegin"); return true; } @Override public boolean onScale(ScaleGestureDetector scaleDetector) { float scaleFactor = scaleDetector.getScaleFactor(); Log.i(TAG, "onScale" + scaleFactor); if (lastScaleFactor == 0 || (Math.signum(scaleFactor) == Math.signum(lastScaleFactor))) { scale *= scaleFactor; scale = Math.max(MIN_ZOOM, Math.min(scale, MAX_ZOOM)); lastScaleFactor = scaleFactor; } else { lastScaleFactor = 0; } return true; } @Override public void onScaleEnd(ScaleGestureDetector scaleDetector) { Log.i(TAG, "onScaleEnd"); } private void applyScaleAndTranslation() { child().setScaleX(scale); child().setScaleY(scale); child().setTranslationX(dx); child().setTranslationY(dy); } private View child() { return getChildAt(0); }}
源文件下载
1 0
- Android自定义View之Layout的放缩(2)
- Android自定义View之Layout的放缩(1)
- Android自定义View之布局(layout)缩放
- Android之在Layout中自定义View
- 自定义View之Layout浅析
- Android自定义view之measure、layout、draw三大流程
- 自定义view的Layout过程
- 【自定义view系列】View的layout过程
- android view的讲解 之 view的工作流程(measure,layout,draw)(二)
- Android自定义view浅谈(二) measure layout 和draw
- Andriod 从0开始自定义控件之 View 的 layout 过程 (八)
- android UI——自定义view(layout)重写方法的分析
- android 自定义View之View的测量(onMeasure()方法)
- android 自定义View之View的测量(onMeasure()方法)
- Android自定义View 之 View的测量
- Android 自定义View之View的绘制
- 自定义View之measure、layout、draw
- 自定义View之Layout方法详解
- JSP-Servlet中文乱码
- Elasticsearch 中文搜索搭建
- 并发与并行
- 树状数组
- [从头学数学] 第175节 统计
- Android自定义View之Layout的放缩(2)
- 【tail】查看文件后n行
- 使用BIND安装智能DNS服务器 添加view和acl配置
- ajax跨域请求实例
- 关于dom 事件冒泡、捕获 dom事件三个阶段
- HDU 4411 Arrest 费用流
- CQOI2016省选游记
- 使用Loadrunner 调用Webservice接口测试
- ios 图片裁剪