如何在触摸图像时通过放大/缩小来全屏查看图像

dee*_*pak 4 android android-layout android-activity

我有以下imagedetails.xml布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/inLay"
        android:layout_width="wrap_content"
        android:layout_height="150dp"
        android:orientation="horizontal" >

        <HorizontalScrollView
            android:id="@+id/hsv"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:fillViewport="true"
            android:measureAllChildren="false"
            android:scrollbars="none" >

            <LinearLayout
                android:id="@+id/innerLay"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <LinearLayout
                    android:id="@+id/controlled_medication"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" >

                    <RelativeLayout
                        android:layout_width="fill_parent"
                        android:layout_height="match_parent" >

                        <ImageView
                            android:id="@+id/image1"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content" />
                    </RelativeLayout>
                </LinearLayout>

                <LinearLayout
                    android:id="@+id/as_needed_medication"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" >

                    <RelativeLayout
                        android:layout_width="fill_parent"
                        android:layout_height="match_parent"
                        android:orientation="horizontal" >

                        <ImageView
                            android:id="@+id/image2"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content" />
                    </RelativeLayout>
                </LinearLayout>
            </LinearLayout>
        </HorizontalScrollView>
    </LinearLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

对于这个xml文件,我写了以下代码:

public class ImageDetails extends Activity {

    LinearLayout asthmaActionPlan, controlledMedication, asNeededMedication,
            rescueMedication, yourSymtoms, yourTriggers, wheezeRate, peakFlow;
    LayoutParams params;
    LinearLayout next, prev;
    int viewWidth;
    GestureDetector gestureDetector = null;
    HorizontalScrollView horizontalScrollView;
    ArrayList<LinearLayout> layouts;
    int parentLeft, parentRight;
    int mWidth;
    int currPosition, prevPosition;


    ImageView image1, image2;


    String pid;


    private ProgressDialog pDialog;


    JSONParser jsonParser = new JSONParser();


    private static final String url_detials = "http://www.example.com/details.php";


    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PRODUCT = "product";
    private static final String TAG_PID = "id";
    Private static final String TAG_IMAGE1 = "image1";
    private static final String TAG_IMAGE2 = "image2";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.productdetails);


        image1 = (ImageView) findViewById(R.id.image1);
        image2 = (ImageView) findViewById(R.id.image2);

        Intent i = getIntent();


        pid = i.getStringExtra(TAG_PID);


        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);

        horizontalScrollView = (HorizontalScrollView) findViewById(R.id.hsv);
        gestureDetector = new GestureDetector(new MyGestureDetector());

        controlledMedication = (LinearLayout) findViewById(R.id.controlled_medication);
        asNeededMedication = (LinearLayout) findViewById(R.id.as_needed_medication);

        Display display = getWindowManager().getDefaultDisplay();
        mWidth = display.getWidth(); // deprecated
        viewWidth = mWidth;
        layouts = new ArrayList<LinearLayout>();
        params = new LayoutParams(viewWidth, LayoutParams.WRAP_CONTENT);
        controlledMedication.setLayoutParams(params);
        asNeededMedication.setLayoutParams(params);

        layouts.add(controlledMedication);
        layouts.add(asNeededMedication);

        horizontalScrollView.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                if (gestureDetector.onTouchEvent(event)) {
                    return true;
                }
                return false;
            }
        });

        new GetDetails().execute();



    }



    class MyGestureDetector extends SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            if (e1.getX() < e2.getX()) {
                currPosition = getVisibleViews("left");
            } else {
                currPosition = getVisibleViews("right");
            }

            horizontalScrollView.smoothScrollTo(layouts.get(currPosition)
                    .getLeft(), 0);
            return true;
        }
    }

    public int getVisibleViews(String direction) {
        Rect hitRect = new Rect();
        int position = 0;
        int rightCounter = 0;
        for (int i = 0; i < layouts.size(); i++) {
            if (layouts.get(i).getLocalVisibleRect(hitRect)) {
                if (direction.equals("left")) {
                    position = i;
                    break;
                } else if (direction.equals("right")) {
                    rightCounter++;
                    position = i;
                    if (rightCounter == 2)
                        break;
                }
            }
        }
        return position;
    }

    class GetDetails extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(ImageDetails.this);
            pDialog.setMessage("Loading Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            // pDialog.show();
        }

        @Override
        protected String doInBackground(String... arg) {


            runOnUiThread(new Runnable() {
                public void run() {

                    int success;
                    try {

                        List<NameValuePair> params = new ArrayList<NameValuePair>();
                        params.add(new BasicNameValuePair("id", pid));


                        JSONObject json = jsonParser.makeHttpRequest(
                                url_detials, "GET", params);



                        success = json.getInt(TAG_SUCCESS);

                        if (success == 1) {

                            JSONArray productObj = json
                                    .getJSONArray(TAG_PRODUCT); 


                            JSONObject product = productObj.getJSONObject(0);

                            Bitmap bitmap = null;
                            Bitmap bitmap2 = null;
                            try {
                                // Download Image from URL
                                InputStream input = new java.net.URL(
                                        product.getString(TAG_IMAGE1))
                                        .openStream();
                                // Decode Bitmap
                                bitmap = BitmapFactory.decodeStream(input);
                                image1.setImageBitmap(bitmap);

                                // Download Image from URL
                                InputStream input2 = new java.net.URL(
                                        product.getString(TAG_IMAGE2))
                                        .openStream();
                                // Decode Bitmap
                                bitmap2 = BitmapFactory.decodeStream(input2);
                                image2.setImageBitmap(bitmap2);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }



                        } else {

                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });
            return null;
        }
    }

    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        pDialog.dismiss();

    }
}
Run Code Online (Sandbox Code Playgroud)

现在它将在水平视图中给出输出,我可以通过手势触摸更改图像.

现在,当我选择任何图像时,它将以全屏显示,并带有缩放/缩小选项.

我试过以下方法:

    image1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            image1.buildDrawingCache();
            Bitmap bitmap = image1.getDrawingCache();

            Intent intent = new Intent(getApplicationContext(),
                    Imagesview.class);
            intent.putExtra("BitmapImage", bitmap);
        }
    });
Run Code Online (Sandbox Code Playgroud)

我正在将图像发送到其他活动,但它不是开放的新活动.

我收到以下错误日志:

FATAL EXCEPTION: main
Process: com.novumlogic.ideal, PID: 18636
  java.lang.NullPointerException
    at com.novumlogic.ideal.ProductDetails$MyGestureDetector.onFling(ProductDetails.java:213)
    at android.view.GestureDetector.onTouchEvent(GestureDetector.java:610)
    at com.novumlogic.ideal.ProductDetails$1.onTouch(ProductDetails.java:133)
    at android.view.View.dispatchTouchEvent(View.java:7772)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2316)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2013)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2145)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1577)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2508)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2093)
    at android.view.View.dispatchPointerEvent(View.java:7973)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4384)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4255)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3801)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3851)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3820)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3927)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3828)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3984)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3801)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3851)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3820)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3828)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3801)
    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6116)
    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6096)
    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6050)
    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6246)
    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:138)
    at android.os.Looper.loop(Looper.java:150)
    at android.app.ActivityThread.main(ActivityThread.java:5333)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

那么,如何通过放大/缩小选项在全屏幕上显示图像?

Riy*_*med 5

Android 不支持 imageViews 的开箱即用缩放功能。所以你必须做一些自定义实现来缩放(放大/缩小)imageView(你所做的)。或者您可以使用第三方库来解除繁重的工作。他们可以处理您的所有场景。我通常更喜欢 Chris Bane 的Photoview


Amr*_*dri 5

下面的类可以用作ZoomView/OUT的ImageView以及DRAG ...

public class TouchImageView extends ImageView {

Matrix 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 last = new PointF();
PointF start = new PointF();
float minScale = 1f;
float maxScale = 3f;
float[] m;


int viewWidth, viewHeight;
static final int CLICK = 3;
float saveScale = 1f;
protected float origWidth, origHeight;
int oldMeasuredWidth, oldMeasuredHeight;


ScaleGestureDetector mScaleDetector;

Context context;

public TouchImageView(Context context) {
    super(context);
    sharedConstructing(context);
}

public TouchImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    sharedConstructing(context);
}

private void stopInterceptEvent()
{
    getParent().requestDisallowInterceptTouchEvent(true);
}

private void startInterceptEvent()
{
getParent().requestDisallowInterceptTouchEvent(false);
}

private void sharedConstructing(Context context) {
    super.setClickable(true);
    this.context = context;
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    matrix = new Matrix();
    m = new float[9];
    setImageMatrix(matrix);
    setScaleType(ScaleType.MATRIX);

    setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mScaleDetector.onTouchEvent(event);
            PointF curr = new PointF(event.getX(), event.getY());

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    last.set(curr);
                    start.set(last);
                    mode = DRAG;
                    stopInterceptEvent();
                    break;

                case MotionEvent.ACTION_MOVE:
                    if (mode == DRAG) {
                        float deltaX = curr.x - last.x;
                        float deltaY = curr.y - last.y;
                        float fixTransX = getFixDragTrans(deltaX, viewWidth, origWidth * saveScale);
                        float fixTransY = getFixDragTrans(deltaY, viewHeight, origHeight * saveScale);
                        matrix.postTranslate(fixTransX, fixTransY);
                        fixTrans();
                        last.set(curr.x, curr.y);

                        float transX = m[Matrix.MTRANS_X];

                        if((int) (getFixTrans(transX, viewWidth, origWidth * saveScale) + fixTransX) == 0)
                            startInterceptEvent();
                        else
                            stopInterceptEvent();
                    }
                    break;

                case MotionEvent.ACTION_UP:
                    mode = NONE;
                    int xDiff = (int) Math.abs(curr.x - start.x);
                    int yDiff = (int) Math.abs(curr.y - start.y);
                    if (xDiff < CLICK && yDiff < CLICK)
                        performClick();
                    startInterceptEvent();
                    break;

                case MotionEvent.ACTION_POINTER_UP:
                    mode = NONE;
                    break;
            }

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

    });
}

public void setMaxZoom(float x) {
    maxScale = x;
}

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        mode = ZOOM;
        return true;
    }

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        float mScaleFactor = detector.getScaleFactor();
        float origScale = saveScale;
        saveScale *= mScaleFactor;
        if (saveScale > maxScale) {
            saveScale = maxScale;
            mScaleFactor = maxScale / origScale;
        } else if (saveScale < minScale) {
            saveScale = minScale;
            mScaleFactor = minScale / origScale;
        }

        if (origWidth * saveScale <= viewWidth || origHeight * saveScale <= viewHeight)
            matrix.postScale(mScaleFactor, mScaleFactor, viewWidth / 2, viewHeight / 2);
        else
            matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY());

        fixTrans();
        return true;
    }
}

void fixTrans() {
    matrix.getValues(m);
    float transX = m[Matrix.MTRANS_X];
    float transY = m[Matrix.MTRANS_Y];

    float fixTransX = getFixTrans(transX, viewWidth, origWidth * saveScale);
    float fixTransY = getFixTrans(transY, viewHeight, origHeight * saveScale);

    if (fixTransX != 0 || fixTransY != 0)
        matrix.postTranslate(fixTransX, fixTransY);
}

float getFixTrans(float trans, float viewSize, float contentSize) {
    float minTrans, maxTrans;

    if (contentSize <= viewSize) {
        minTrans = 0;
        maxTrans = viewSize - contentSize;
    } else {
        minTrans = viewSize - contentSize;
        maxTrans = 0;
    }

    if (trans < minTrans)
        return -trans + minTrans;
    if (trans > maxTrans)
        return -trans + maxTrans;
    return 0;
}

float getFixDragTrans(float delta, float viewSize, float contentSize) {
    if (contentSize <= viewSize) {
        return 0;
    }
    return delta;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    viewWidth = MeasureSpec.getSize(widthMeasureSpec);
    viewHeight = MeasureSpec.getSize(heightMeasureSpec);

    //
    // Rescales image on rotation
    //
    if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight
            || viewWidth == 0 || viewHeight == 0)
        return;
    oldMeasuredHeight = viewHeight;
    oldMeasuredWidth = viewWidth;

    if (saveScale == 1) {
        //Fit to screen.
        float scale;

        Drawable drawable = getDrawable();
        if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0)
            return;
        int bmWidth = drawable.getIntrinsicWidth();
        int bmHeight = drawable.getIntrinsicHeight();

        Log.d("bmSize", "bmWidth: " + bmWidth + " bmHeight : " + bmHeight);

        float scaleX = (float) viewWidth / (float) bmWidth;
        float scaleY = (float) viewHeight / (float) bmHeight;
        scale = Math.min(scaleX, scaleY);
        matrix.setScale(scale, scale);

        // Center the image
        float redundantYSpace = (float) viewHeight - (scale * (float) bmHeight);
        float redundantXSpace = (float) viewWidth - (scale * (float) bmWidth);
        redundantYSpace /= (float) 2;
        redundantXSpace /= (float) 2;

        matrix.postTranslate(redundantXSpace, redundantYSpace);

        origWidth = viewWidth - 2 * redundantXSpace;
        origHeight = viewHeight - 2 * redundantYSpace;
        setImageMatrix(matrix);
    }


    fixTrans();
}
}
Run Code Online (Sandbox Code Playgroud)

替换您的ImageView

<ImageView
android:id="@+id/image1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)

这一个:

<com.pkg.TouchImageView
android:id="@+id/image1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)

您可以在此处使用RecyclingImageView作为超级类,以提高您的应用效率.它也适用于Android原生ImageView

我希望这对你有帮助.