Android 当有多个图像视图时,如何执行收缩放大或缩小?

Android 当有多个图像视图时,如何执行收缩放大或缩小?,android,android-layout,pinchzoom,zooming,android-gesture,Android,Android Layout,Pinchzoom,Zooming,Android Gesture,我知道这类问题已经被问过很多次了,但这是不同的情况,一旦通过问题,然后决定 问题: 在这里,我提供了我的应用程序的部分代码,其中它当前执行收缩放大和拖放图像。这一切工作正常,但实际问题始于屏幕上添加两个图像,然后如果我在屏幕上应用收缩手势,它将开始对两个图像进行缩放,因此,目前,我已经应用了一个条件来限制这种行为,仅限于单个图像。但是,如果我想单独对两个图像执行放大/缩小,而不是应用条件,我应该怎么做 1:是否可以为单个视图实现单独的scalegestruedetector 2:这与图像的拖放有

我知道这类问题已经被问过很多次了,但这是不同的情况,一旦通过问题,然后决定

问题: 在这里,我提供了我的应用程序的部分代码,其中它当前执行收缩放大和拖放图像。这一切工作正常,但实际问题始于屏幕上添加两个图像,然后如果我在屏幕上应用收缩手势,它将开始对两个图像进行缩放,因此,目前,我已经应用了一个条件来限制这种行为,仅限于单个图像。但是,如果我想单独对两个图像执行放大/缩小,而不是应用条件,我应该怎么做

1:是否可以为单个视图实现单独的scalegestruedetector

2:这与图像的拖放有关吗

我也尝试使用代码打开,但这也为一次缩小一张图像提供了代码

希望你们能理解这个问题

public class Test extends Activity implements OnClickListener
{

private static final String TAG = Test.class.getSimpleName();

private ImageView leftArrowImageView, rightArrowImageView,
        selectedBackgroundImage, selectedImageView, secondImage,
        imageView1, secondImageView;

private Gallery gallery;

private int selectedImagePosition = 0;

private List<Drawable> drawables;

private GalleryImageAdapter galImageAdapter;
float m_lastTouchX, m_lastTouchY, m_posX, m_posY, m_prevX, m_prevY,
        m_imgXB, m_imgYB, m_imgXC, m_imgYC, m_dx, m_dy;

AbsoluteLayout parentLayout;
private Button saveImage, undoAll;

RelativeLayout composedImageParentLayout;
private Matrix m_matrix = new Matrix();
private Matrix originalMatrix = new Matrix();
private float scale = 1f;

private ScaleGestureDetector sgd;
private boolean isImageIsSaved = false;
private Context m_context;
private int numberOfImages = 0;

AbsoluteLayout secondImageLayout;

//private TouchImageView imgPreview;

// These matrices will be used to move and zoom image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();

// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    m_context = this;
    m_prevX = 0;
    m_prevY = 0;
    m_imgXB = 50;
    m_imgYB = 100;
    m_imgXC = 150;
    m_imgYC = 100;

    getDrawablesList();
    setupUI();

    sgd = new ScaleGestureDetector(this, new ScaleListener());

    //Setting Background image

    Intent backgroundImageIntent = getIntent();
    byte[] bytes = backgroundImageIntent.getByteArrayExtra(ImageChooserActivity.SELECTED_IMAGE);

    Bitmap actualImage = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

    selectedBackgroundImage.setImageBitmap(actualImage);

}

private void setupUI()
{

    selectedImageView = (ImageView) findViewById(R.id.selected_imageview);
    leftArrowImageView = (ImageView) findViewById(R.id.left_arrow_imageview);
    rightArrowImageView = (ImageView) findViewById(R.id.right_arrow_imageview);
    saveImage = (Button) findViewById(R.id.saveImage);
    parentLayout = (AbsoluteLayout) findViewById(R.id.parentlayout);
    composedImageParentLayout = (RelativeLayout) findViewById(R.id.ddalTop);
    gallery = (Gallery) findViewById(R.id.gallery);
    undoAll = (Button) findViewById(R.id.undoAll);
    selectedBackgroundImage = (ImageView) findViewById(R.id.backgroundImage);

    secondImage = new ImageView(m_context);
    secondImageLayout = new AbsoluteLayout(m_context);
    saveImage.setOnClickListener(this);
    imageView1 = (ImageView) findViewById(R.id.imageView1);
    secondImageView = (ImageView) findViewById(R.id.secondImageView);

    undoAll.setOnClickListener(this);

    leftArrowImageView.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {

            if (selectedImagePosition > 0)
            {
                --selectedImagePosition;

            }

            gallery.setSelection(selectedImagePosition, false);
        }
    });

    rightArrowImageView.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {

            if (selectedImagePosition < drawables.size() - 1)
            {
                ++selectedImagePosition;

            }

            gallery.setSelection(selectedImagePosition, false);

        }
    });

    gallery.setOnItemSelectedListener(new OnItemSelectedListener()
    {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
        {

            selectedImagePosition = pos;

            if (selectedImagePosition > 0 && selectedImagePosition < drawables.size() - 1)
            {

                leftArrowImageView.setImageDrawable(getResources().getDrawable(R.drawable.arrow_left_enabled));
                rightArrowImageView.setImageDrawable(getResources().getDrawable(R.drawable.arrow_right_enabled));

            }
            else if (selectedImagePosition == 0)
            {

                leftArrowImageView.setImageDrawable(getResources().getDrawable(R.drawable.arrow_left_disabled));

            }
            else if (selectedImagePosition == drawables.size() - 1)
            {

                rightArrowImageView.setImageDrawable(getResources().getDrawable(R.drawable.arrow_right_disabled));
            }

            changeBorderForSelectedImage(selectedImagePosition);
            setSelectedImage(selectedImagePosition);
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0)
        {

        }

    });

    galImageAdapter = new GalleryImageAdapter(this, drawables);

    gallery.setAdapter(galImageAdapter);

    if (drawables.size() > 0)
    {

        gallery.setSelection(selectedImagePosition, false);

    }

    if (drawables.size() == 1)
    {

        rightArrowImageView.setImageDrawable(getResources().getDrawable(R.drawable.arrow_right_disabled));
    }

}

private void changeBorderForSelectedImage(int selectedItemPos)
{

    int count = gallery.getChildCount();

    for (int i = 0; i < count; i++)
    {

        ImageView imageView = (ImageView) gallery.getChildAt(i);
        imageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.image_border));
        imageView.setPadding(3, 3, 3, 3);

    }

    ImageView imageView = (ImageView) gallery.getSelectedView();
    imageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.selected_image_border));
    imageView.setPadding(3, 3, 3, 3);
}

private void getDrawablesList()
{

    drawables = new ArrayList<Drawable>();
    drawables.add(getResources().getDrawable(R.drawable.natureimage1));
    drawables.add(getResources().getDrawable(R.drawable.natureimage2));
    drawables.add(getResources().getDrawable(R.drawable.natureimage3));
    drawables.add(getResources().getDrawable(R.drawable.natureimage4));
    drawables.add(getResources().getDrawable(R.drawable.natureimage5));
    drawables.add(getResources().getDrawable(R.drawable.natureimage6));
    drawables.add(getResources().getDrawable(R.drawable.natureimage7));
    drawables.add(getResources().getDrawable(R.drawable.natureimage8));
    drawables.add(getResources().getDrawable(R.drawable.natureimage9));
    drawables.add(getResources().getDrawable(R.drawable.natureimage10));
    drawables.add(getResources().getDrawable(R.drawable.natureimage11));
    drawables.add(getResources().getDrawable(R.drawable.natureimage12));
    drawables.add(getResources().getDrawable(R.drawable.natureimage13));
    drawables.add(getResources().getDrawable(R.drawable.natureimage14));
    drawables.add(getResources().getDrawable(R.drawable.natureimage15));

}

private void setSelectedImage(int selectedImagePosition)
{
    //Set selected image and setOnTouchListener(touchListenerForZoomAndDrag);
}

/**
 * Touch listener for view
 */
View.OnTouchListener m_onTouchListener = new View.OnTouchListener()
{

    @Override
    public boolean onTouch(View p_v, MotionEvent p_event)
    {

        Log.d(TAG, "onTouch event is going on : " + p_v);

        logAllEvents("drag or drop operation is performed");
        switch (p_event.getAction())
        {
        case MotionEvent.ACTION_DOWN:
        {
            m_lastTouchX = p_event.getX();
            m_lastTouchY = p_event.getY();

            break;
        }
        case MotionEvent.ACTION_MOVE:
        {
            m_dx = p_event.getX() - m_lastTouchX;
            m_dy = p_event.getY() - m_lastTouchY;

            m_posX = m_prevX + m_dx;
            m_posY = m_prevY + m_dy;

            if (m_posX > 0 && m_posY > 0 && (m_posX + p_v.getWidth()) < parentLayout.getWidth() && (m_posY + p_v.getHeight()) < parentLayout.getHeight())
            {
                p_v.setLayoutParams(new AbsoluteLayout.LayoutParams(p_v.getMeasuredWidth(), p_v.getMeasuredHeight(), (int) m_posX, (int) m_posY));
                m_prevX = m_posX;
                m_prevY = m_posY;

            }

            break;

        }

        }
        return true;
    }
};

View.OnTouchListener touchListenerForZoomAndDrag = new View.OnTouchListener()
{
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {

        switch (v.getId())
        {

        ImageView view = (ImageView) v;

        Log.d(TAG, "Coordinates of touch event: " + event.getX() + " And Y : " + event.getY());
        // Dump touch event to log
        dumpEvent(event);

        // Handle touch events here...
        switch (event.getAction() & MotionEvent.ACTION_MASK)
        {
        case MotionEvent.ACTION_DOWN:
            savedMatrix.set(matrix);

            Log.d(TAG, "View on Action Down is performed" + v);

            start.set(event.getX(), event.getY());
            Log.d(TAG, "mode=DRAG");
            mode = DRAG;
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            oldDist = spacing(event);
            Log.d(TAG, "oldDist=" + oldDist);
            if (oldDist > 10f)
            {
                savedMatrix.set(matrix);
                midPoint(mid, event);
                mode = ZOOM;
                Log.d(TAG, "mode=ZOOM");
            }
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            Log.d(TAG, "mode=NONE");
            break;
        case MotionEvent.ACTION_MOVE:
            if (mode == DRAG)
            {
                matrix.set(savedMatrix);
                matrix.postTranslate(event.getX() - start.x, event.getY() -     start.y);
            }
            else if (mode == ZOOM)
            {
                float newDist = spacing(event);
                Log.d(TAG, "newDist=" + newDist);
                if (newDist > 10f)
                {
                    matrix.set(savedMatrix);
                    float scale = newDist / oldDist;
                    matrix.postScale(scale, scale, mid.x, mid.y);
                }
            }
            break;
        }

        view.setImageMatrix(matrix);
        return true; // indicate event was handled
    }
};

/** Determine the space between the first two fingers */
private float spacing(MotionEvent event)
{
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(1);
    return FloatMath.sqrt(x * x + y * y);
}

/** Calculate the mid point of the first two fingers */
private void midPoint(PointF point, MotionEvent event)
{
    float x = event.getX(0) + event.getX(1);
    float y = event.getY(0) + event.getY(1);
    point.set(x / 2, y / 2);
}

/** Show an event in the LogCat view, for debugging */
private void dumpEvent(MotionEvent event)
{
    String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
    StringBuilder sb = new StringBuilder();
    int action = event.getAction();
    int actionCode = action & MotionEvent.ACTION_MASK;
    sb.append("event ACTION_").append(names[actionCode]);

    if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP)
    {
        sb.append("(pid ").append(action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
        sb.append(")");
    }

    sb.append("[");
    for (int i = 0; i < event.getPointerCount(); i++)
    {
        sb.append("#").append(i);
        sb.append("(pid ").append(event.getPointerId(i));
        sb.append(")=").append((int) event.getX(i));
        sb.append(",").append((int) event.getY(i));
        if (i + 1 < event.getPointerCount()) sb.append(";");
    }

    sb.append("]");
    Log.d("Touch Events ---------", sb.toString());
}

private void saveImage()
{
    //Code to save image
}

@Override
public void onClick(View view)
{
    switch (view.getId())
    {
    case R.id.saveImage:
        logAllEvents("saveImage is clicked");

        saveImage();
        break;
    case R.id.undoAll:
        logAllEvents("undoAll is clicked");
        //undoAllChanges();
        break;
    }
}

private void undoAllChanges()
{
    //TODO
}

@Override
public boolean onTouchEvent(MotionEvent ev)
{
    sgd.onTouchEvent(ev);
    return true;
}

private class ScaleListener extends
        ScaleGestureDetector.SimpleOnScaleGestureListener
{
    @Override
    public boolean onScale(ScaleGestureDetector scaleGestureDetector)
    {
        //          Log.d(TAG, "Is image is saved for zoom in & out : " + isImageIsSaved);
        scale *= scaleGestureDetector.getScaleFactor();

        scale = Math.max(0.1f, Math.min(scale, 10.0f));
        m_matrix.setScale(scale, scale);

        if (secondImageLayout.getChildCount() > 0)
        {
            Log.d(TAG, "Second image is there...");
            secondImage.setImageMatrix(m_matrix);
            logAllEvents("Image Scaling on secondImage");
        }
        else
        {
            Log.d(TAG, "Only Single image is there");
            selectedImageView.setImageMatrix(m_matrix);
            logAllEvents("Image Scaling on selectedImageView");
        }

        return true;
    }

}

//Log all events that are occuring
private void logAllEvents(String message)
{
    Log.d(TAG, "Event name : " + message);
}


}
main.xml

此代码的当前输出:

从图像中,你们可以理解什么可能是实际问题。我想分别调整这两个图像的大小。目前,它一次只能处理单个图像

请参阅[连结][1][1]:
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/parentlayout"
            android:orientation="vertical">

<RelativeLayout
    android:id="@+id/ddalTop"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/backgroundImage"
        android:layout_width="fill_parent"
        android:layout_height="300dp"
        android:src="@drawable/ic_launcher"/>

    <!--<FrameLayout
        android:layout_alignParentLeft="true"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleType="matrix"
            />
    </FrameLayout>

    <FrameLayout
        android:layout_alignParentRight="true"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <ImageView
            android:id="@+id/secondImageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleType="matrix"
            />

    </FrameLayout>-->


</RelativeLayout>

<!--
    <RelativeLayout
        android:gravity="start"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    </RelativeLayout>

    <RelativeLayout
        android:gravity="end"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
    </RelativeLayout>-->

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="fill_parent"
    android:layout_height="300dp"
    android:scaleType="matrix"
    />
<ImageView
    android:id="@+id/secondImageView"
    android:layout_width="fill_parent"
    android:layout_height="300dp"
    android:scaleType="matrix"
    />

<RelativeLayout
    android:id="@+id/gallery_relative_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="bottom">

    <ImageView
        android:id="@+id/left_arrow_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="15dip"
        android:src="@drawable/arrow_left_disabled"/>

    <Gallery
        android:id="@+id/gallery"
        android:layout_width="0dip"
        android:layout_height="120dp"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:layout_alignParentBottom="true"
        android:layout_toLeftOf="@+id/right_arrow_imageview"
        android:layout_toRightOf="@+id/left_arrow_imageview"
        android:spacing="20dip"/>

    <ImageView
        android:id="@+id/right_arrow_imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="15dip"
        android:src="@drawable/arrow_right_enabled"/>

    <!--<Button
        android:id="@+id/getPhoto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/getPic"
        android:layout_y="298dp"
        android:layout_alignParentBottom="true"
        android:layout_alignLeft="@+id/left_arrow_imageview"
        android:layout_alignStart="@+id/left_arrow_imageview"/>-->

    <!-- <Button
         android:id="@+id/takePhoto"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="@string/takePhoto"
         android:layout_alignParentBottom="true"
         android:layout_centerHorizontal="true"/>-->


</RelativeLayout>

<ImageView
    android:id="@+id/selected_imageview"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:scaleType="matrix"
    android:layout_x="148dp"
    android:layout_y="227dp"/>

<Button
    android:id="@+id/undoAll"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/undoAll"
    android:enabled="false"
    android:layout_x="3dp"
    android:layout_y="356dp"
    android:layout_alignTop="@+id/saveImage"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"/>

<Button
    android:id="@+id/saveImage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/saveImage"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_x="252dp"
    android:layout_y="355dp"/>

</AbsoluteLayout>