如何在手势上旋转和缩放ImageView(不是图像)?

时间:2014-07-01 10:53:54

标签: android bitmap imageview android-imageview android-animation

我有多个ImageView动态添加到一个活动中,我希望所有的ImageView都可以在触摸手势上旋转和缩放(在它们上面)。我一直在寻找,我所能做的就是

1)下面用于处理旋转手势并找到所需的旋转角度

public class RotationGestureDetector {
    private static final int INVALID_POINTER_ID = -1;
    private float fX, fY, sX, sY;
    private int ptrID1, ptrID2;
    private float mAngle;

    private OnRotationGestureListener mListener;

    public float getAngle() {
        return mAngle;
    }

    public RotationGestureDetector(OnRotationGestureListener listener){
        mListener = listener;
        ptrID1 = INVALID_POINTER_ID;
        ptrID2 = INVALID_POINTER_ID;
    }

    public boolean onTouchEvent(MotionEvent event,ImageView newImageView){
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                ptrID1 = event.getPointerId(event.getActionIndex());
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                ptrID2 = event.getPointerId(event.getActionIndex());
                sX = event.getX(event.findPointerIndex(ptrID1));
                sY = event.getY(event.findPointerIndex(ptrID1));
                fX = event.getX(event.findPointerIndex(ptrID2));
                fY = event.getY(event.findPointerIndex(ptrID2));
                break;
            case MotionEvent.ACTION_MOVE:
                if(ptrID1 != INVALID_POINTER_ID && ptrID2 != INVALID_POINTER_ID){
                    float nfX, nfY, nsX, nsY;
                    nsX = event.getX(event.findPointerIndex(ptrID1));
                    nsY = event.getY(event.findPointerIndex(ptrID1));
                    nfX = event.getX(event.findPointerIndex(ptrID2));
                    nfY = event.getY(event.findPointerIndex(ptrID2));

                    mAngle = angleBetweenLines(fX, fY, sX, sY, nfX, nfY, nsX, nsY);

                    if (mListener != null) {
                        mListener.OnRotation(this, newImageView);
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                ptrID1 = INVALID_POINTER_ID;
                break;
            case MotionEvent.ACTION_POINTER_UP:
                ptrID2 = INVALID_POINTER_ID;
                break;
        }
        return true;
    }

    private float angleBetweenLines (float fX, float fY, float sX, float sY, float nfX, float nfY, float nsX, float nsY)
    {
        float angle1 = (float) Math.atan2( (fY - sY), (fX - sX) );
        float angle2 = (float) Math.atan2( (nfY - nsY), (nfX - nsX) );

        float angle = ((float)Math.toDegrees(angle1 - angle2)) % 360;
        if (angle < -180.f) angle += 360.0f;
        if (angle > 180.f) angle -= 360.0f;
        return angle;
    }

    public static interface OnRotationGestureListener {
        public void OnRotation(RotationGestureDetector rotationDetector,ImageView newImageView);
    }
}

2)下面用于使用获得的角度旋转我的ImageView的代码,它可以工作但崩溃和    反应非常缓慢。

Matrix mat = new Matrix();
Bitmap bMap = ((BitmapDrawable)newImageView.getDrawable()).getBitmap(); ;
mat.postRotate(angle, bMap.getWidth()/2,bMap.getHeight()/2);
Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0,bMap.getWidth(),bMap.getHeight(), mat, true);
newImageView.setImageBitmap(bMapRotate);

3)我尝试过AnimationRotation,但在这种情况下,Image正在旋转而不是ImageView。

同样在上述两种情况下,ImageView都会在触摸它时以旧位置显示。

我正在使用以下代码处理“拖动”。

@Override
            public boolean onTouch(View v, MotionEvent event) 
            {
                 mRotationDetector.onTouchEvent(event, newImageView);

                float x = event.getX();
                 float y = event.getY();


                System.out.println("matrix=" + savedMatrix.toString());



                switch(event.getAction())
                {
                    case MotionEvent.ACTION_DOWN :
                    {

                        parms = (RelativeLayout.LayoutParams) newImageView.getLayoutParams();


                        dx = event.getRawX() - parms.leftMargin;
                        dy = event.getRawY() - parms.topMargin;
                        touchFlag=1;






                    }
                    break;
                    case MotionEvent.ACTION_MOVE :
                    {
                        touchFlag=0;
                        x = event.getRawX();
                        y = event.getRawY();
                        parms.leftMargin = (int) (x-dx);
                        parms.topMargin = (int) (y - dy);
                        newImageView.setLayoutParams(parms);





                    }
                    break;
                case MotionEvent.ACTION_UP :
                    {



                    }
                    break;
                }


                return false;
            }



        });

请提前给我一些有用的链接或代码

0 个答案:

没有答案