Matrix 확대 축소 그림에 대한 onTouch 감청

3824 단어
private final class TouchListener implements View.OnTouchListener {

        /**                     */
        private int mode = 0;//     
        /**        */
        private static final int MODE_DRAG = 1;
        /**          */
        private static final int MODE_ZOOM = 2;
        /**                 */
        private Matrix matrix = new Matrix();
        /**                    */
        private Matrix currentMatrix = new Matrix();
        private Matrix defaultMatrix = new Matrix();
        /**               */
        private PointF startPoint = new PointF();

        /**           */
        private float startDis;
        /**          */
        private PointF midPoint;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            /**             MotionEvent.ACTION_MASK = 255 */
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                //       
                case MotionEvent.ACTION_DOWN:
                    mode = MODE_DRAG;
                    //   ImageView       
                    currentMatrix.set(imageView.getImageMatrix());
                    startPoint.set(event.getX(), event.getY());
                    break;
                //         ,         
                case MotionEvent.ACTION_MOVE:
                    //     
                    if (mode == MODE_DRAG) {
                        float dx = event.getX() - startPoint.x;
                        //   x      
                        float dy = event.getY() - startPoint.y; 
                        //   x      
                        //                
                        matrix.set(currentMatrix);
                        //       
                        matrix.postTranslate(dx, dy);
                    }
//                          
                    else if (mode == MODE_ZOOM) {
                        float endDis = distance(event);
                        //     
                        if (endDis > 10f) {
                         //                10
                            float scale = endDis / startDis;
                            //       
                            matrix.set(currentMatrix);
                            matrix.postScale(scale, scale,midPoint.x,midPoint.y);
                        }
                    }
                    break;
                //       
                case MotionEvent.ACTION_UP:
                    //        ,         (  )
                    matrix.set(defaultMatrix);
                case MotionEvent.ACTION_POINTER_UP:
                    mode = 0;
                    break;
//                         (  ),          
                case MotionEvent.ACTION_POINTER_DOWN:
                    mode = MODE_ZOOM;
                    /**            */
                    startDis = distance(event);
                    /**             */
                    if (startDis > 10f) { //                 10
                        midPoint = mid(event);
                        //    ImageView     
                        currentMatrix.set(imageView.getImageMatrix());
                    }
                    break;
            }
            imageView.setImageMatrix(matrix);
            return true;
        }

        /**            */
        private 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);
        }

        /**             */
        private 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);
        }

    }

좋은 웹페이지 즐겨찾기