如何在android中将图像拖出一半

时间:2015-05-14 12:38:18

标签: android

我正在制作应用程序,我想在屏幕上拖动图像。现在一切正常,但如果用户继续从左向右滑动,图像会更进一步向右移动。我不想这样做。

我想要的是图像不应该超出其边界宽度的一半。我的意思是图像视图应该只在视图/边界的一半。我希望它在我的意思是左,右,上,下的每个坐标中都偏离一半。它不应该消失。为此,我使用触摸监听器。现在我能够进行旋转,缩放和拖动(虽然它超出界限)

所以现在我想它不应该超出界限,这是我正在使用的代码:

 @Override
public boolean onTouch(View v, MotionEvent event) {

    //  ImageView view = (ImageView) v;


    //view.setScaleType(ImageView.ScaleType.MATRIX);
    float scale;

    // Dump touch event to log
    dumpEvent(event);

   // Handle touch events here...


    ImageView imageView = (ImageView) v;

    switch (event.getAction() & MotionEvent.ACTION_MASK) {

        case MotionEvent.ACTION_DOWN:
            savedMatrix.set(matrix);
            start.set(event.getX(), event.getY());
            mode = DRAG;
            lastEvent = null;
            break;

        case MotionEvent.ACTION_POINTER_DOWN:
            oldDistance = spacing(event);
            if (oldDistance > 10f) {
                savedMatrix.set(matrix);
                midPoint(mid, event);
                mode = ZOOM;
                                lastEvent = new float[4];
            lastEvent[0] = event.getX(0);
            lastEvent[1] = event.getX(1);
            lastEvent[2] = event.getY(0);
            lastEvent[3] = event.getY(1);
            d = rotation(event);

            }
            break;

        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            lastEvent = null;
            break;

        case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) {
                float newX = event.getX() - start.x;
                float newY = event.getY() - start.y;
                if ( newX <= 0-(imageView.getDrawable()
                       .getIntrinsicWidth() )){

                    Log.v("Bounds", "0-drawable width");
                    break;

                }else if (newX >= screenWidth-(imageView.getDrawable()
                        .getIntrinsicWidth())){

                    Log.v("Bounds", "screen wdith-drawable width");
                    break;

                }else if(newY <= 0-(imageView.getDrawable()
                       .getIntrinsicHeight())){

                    Log.v("Bounds", "Y 0-drawable width");
                    break;


                }else if(newY >= (screenHeight-imageView.getDrawable()
                      .getIntrinsicHeight()) ) {

                    Log.v("Bounds", "y Screen-drawable width");
                    break;


                }



                matrix.set(savedMatrix);
                matrix.postTranslate(newX, newY);




            } else if (mode == ZOOM && event.getPointerCount() == 2) {
                float newDistance = spacing(event);
                if (newDistance > 10f) {
                    matrix.set(savedMatrix);
                    scale = newDistance / oldDistance;
                    float[] values = new float[9];
                    matrix.getValues(values);
                    float currentScale = values[Matrix.MSCALE_X];
                    if (scale * currentScale > MAX_ZOOM)
                        scale = MAX_ZOOM / currentScale;
                    else if (scale * currentScale < MIN_ZOOM)
                        scale = MIN_ZOOM / currentScale;
                    matrix.postScale(scale, scale, mid.x, mid.y);
                }
                if (lastEvent != null) {
                   newRot = rotation(event);
                    float r = newRot - d;
                    /* changes must be

                    float[] values = new float[9];
                    matrix.getValues(values);
                    float tx = values[2];
                    float ty = values[5];
                    float sx = values[0];
                    float xc = (view.getWidth() / 2) * sx;
                    float yc = (view.getHeight() / 2) * sx;
                    matrix.postRotate(r, tx + xc, ty + yc);
                     */
                    float[] values = new float[9];
                    matrix.getValues(values);
                    float tx = values[2];
                    float ty = values[5];
                    float sx = values[0];
                    float xc = (imageView.getWidth() / 2) * sx;
                    float yc = (imageView.getHeight() / 2) * sx;
                    matrix.postRotate(r, tx + xc, ty + yc);
                    //I commented
                    matrix.postRotate(r, imageView.getMeasuredWidth() / 2,
                            imageView.getMeasuredHeight() / 2);
               }

            }


            break;
    }

            imageView.setImageMatrix(matrix);
            return true;
    }

Eidt

  

这是我的XML

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/rl_capture">


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/fl_camera">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="content_desc_overlay"
        android:src="@drawable/ic_launcher"
        android:id="@+id/img_view"

        />


    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/iv_overlay"
        android:src="@drawable/groom01"
        android:scaleType="matrix"

        />

</FrameLayout>


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/btn_screenshot"
        android:layout_gravity="right|top"
        />

</RelativeLayout>

1 个答案:

答案 0 :(得分:0)

嗯。这有点令人困惑。您使用intrinsicWidth / intrinsicHeight是否有某些特殊原因?这些通常不会产生我认为你认为他们屈服的东西(see here)。我假设您的imageView设置为LayoutParams,而您的重力未设置,因此图像的原点位于左上角。这就是我要做的事情(没有经过测试 - 告诉我是否有问题):

    case MotionEvent.ACTION_MOVE:
        if (mode == DRAG) {
            float newX = event.getX() - start.x;
            float newY = event.getY() - start.y;

            if ( newX < -imageView.getWidth()/2)){

                Log.v("Bounds", "0-drawable width");
                newX = -imageView.getWidth()/2;

            }else if (newX > screenWidth-(imageView.getWidth()/2)){

                Log.v("Bounds", "screen wdith-drawable width");
                newX = screenWidth-(imageView.getWidth()/2);
            }


            // not else-if: consider the corners!
            if(newY < -imageView.getHeight()/2){

                Log.v("Bounds", "Y 0-drawable width");
                newY = -imageView.getHeight()/2;


            }else if(newY > (screenHeight-imageView.getHeight()/2) ) {

                Log.v("Bounds", "y Screen-drawable width");
                newY = screenHeight-imageView.getHeight()/2;

            }

等等。