2016-05-11 7 views
0

Wie kann man verhindern, dass Bildansicht aus dem Bildschirm gezogen wird?Wie kann man verhindern, dass Bildansicht den Bildschirm verlässt?

Java-Datei zu Farbgrenze von Imageview

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear); 


    ShapeDrawable sd = new ShapeDrawable(); 

    // Specify the shape of ShapeDrawable 
    sd.setShape(new RectShape()); 

    // Specify the border color of shape 
    sd.getPaint().setColor(Color.RED); 

    // Set the border width 
    sd.getPaint().setStrokeWidth(10f); 

    // Specify the style is a Stroke 
    sd.getPaint().setStyle(Paint.Style.STROKE); 

    // Finally, add the drawable background to Imageview 
    linearLayout.setBackground(sd); 

Bild bekommt i aus dem Bildschirm Imageview innerhalb des Layouts zu bewegen i

Touch1 Klasse verwendet, um remian in möchten und vergrößern und verkleinern Bildansicht

package com.example.pc_4.borderingimageview; 

import android.graphics.Matrix; 
import android.graphics.PointF; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 

public class Touch1 implements OnTouchListener { 

    // 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 boolean onTouch(View v, MotionEvent event) { 
     ImageView view = (ImageView) v; 
     // Dump touch event to log 
     dumpEvent(event); 

     // Handle touch events here... 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       savedMatrix.set(matrix); 
       start.set(event.getX(), event.getY()); 
       mode = DRAG; 
       break; 
      case MotionEvent.ACTION_POINTER_DOWN: 
       oldDist = spacing(event); 
       if (oldDist > 10f) { 
        savedMatrix.set(matrix); 
        midPoint(mid, event); 
        mode = ZOOM; 
       } 
       break; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_POINTER_UP: 
       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); 
        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 
    } 

    /** 
    * 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("]"); 
    } 

    /** 
    * 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 (float) Math.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); 
    } 

    public void drag(MotionEvent event, View v) { 

     FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) v.getLayoutParams(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_MOVE: { 
       params.topMargin = (int) event.getRawY() - (v.getHeight()); 
       params.leftMargin = (int) event.getRawX() - (v.getWidth()/2); 
       v.setLayoutParams(params); 
       break; 
      } 
      case MotionEvent.ACTION_UP: { 
       params.topMargin = (int) event.getRawY() - (v.getHeight()); 
       params.leftMargin = (int) event.getRawX() - (v.getWidth()/2); 
       v.setLayoutParams(params); 
       break; 
      } 
      case MotionEvent.ACTION_DOWN: { 
       v.setLayoutParams(params); 
       break; 
      } 
     } 
    } 
} 

xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/rl" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity"> 

    <LinearLayout 
     android:id="@+id/linear" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_centerInParent="true" 
     android:orientation="vertical"> 

     <ImageView 
      android:layout_centerInParent="true" 
      android:id="@+id/TestImage" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:src="@drawable/logo" /> 

     <!-- <Button 
      android:id="@+id/btn" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/TestImage" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="44dp" 
      android:text="Set border" />--> 

    </LinearLayout> 
</RelativeLayout> 

out put i got from above code

Antwort

0

Sie unter Code innerhalb onTouch Methode mit case MotionEvent.ACTION_MOVE:

if(view.getId == R.id.TestImage) { 
    // do nothing 
} else { 
// rest of your code 
} 

versuchen, es zu ändern versuchen können, und prüfen, ob es funktioniert.

+0

tauqir ... Vergleichen Ansicht id wie kann Ziehen aus dem Bildschirm verhindern? oder ich weiß nicht, wie man deinen Vorschlag durchführt. kannst du es für mich machen oder bitte ausarbeiten? – newpie

+0

Beim Vergleichen von View-IDs wird die ID der Drag-Ansicht angezeigt. Wenn Sie 'TestImage' nicht ziehen wollen, dann holen Sie sich seine ID und tun Sie nichts. Dadurch wird sichergestellt, dass Ihr 'TestImage' nicht gezogen wird. – Tauqir

0

Sie können eine if-Bedingung wie

case MotionEvent.ACTION_MOVE: { 
      params.topMargin = (int) event.getRawY() - (v.getHeight()); 
      params.leftMargin = (int) event.getRawX() - (v.getWidth()/2); 
      if(v.getX()> 0) { //some kind of check 
      v.setLayoutParams(params); 
      }     
      break; 
     } 

diesen Code auch setzen, die in ACTION_MOVE genug scheint.

+0

was ist params hier ... wie ich param bekomme ist linear layouts höhe und gewicht also wie kann ich diesen param in der touch-klasse bekommen? – newpie

+0

es würde wirklich geschätzt werden, wenn Sie Änderungen in meinem oben genannten Code vorgenommen haben, denn wie neu für Android und heruntergeladenen Code ist es ein bisschen schwer, eigene Änderungen zu machen .Thnaks – newpie

0

Ich habe diesen Code erstellt, und so weit es funktioniert, wie ich es in Ihrem Code zu sehen, verwenden wir den gleichen Namen für die Variablen, so können Sie es einfach kopieren einfügen:

Fall MotionEvent.ACTION_MOVE:

if (Modus == DRAG) { matrix.set (savedMatrix);

float imgWidthRight = 0; //image.getWidth() - (image.getWidth()- 1); 
float imgWidthLeft = -(image.getWidth() - (image.getWidth()/4)); 
float xValue; 

float imgHeightUp = -(image.getHeight() - (image.getHeight()/5)); 
float imgHeightDown = image.getHeight() - (image.getHeight()/2); 
float yValue; 

float[] f_mtrx = new float[9]; 
float[] f_img = new float[9]; 
matrix.getValues(f_mtrx); 
image.getImageMatrix().getValues(f_img); 

if ((f_img[2] > imgWidthRight) && (event.getX() - start.x > 0)) { 
xValue = 0; 
} else if ((f_img[2] < imgWidthLeft) && (event.getX() - start.x < 0)) { 
xValue = 0; 
} else { 
xValue = event.getX() - start.x; 
} 

if ((f_img[5] > imgHeightDown) && (event.getY() - start.y > 0)) { 
yValue = 0; 
} else if ((f_img[5] < imgHeightUp) && (event.getY() - start.y < 0)) { 
yValue = 0; 
} else { 
yValue = event.getY() - start.y; 
} 

matrix.postTranslate(xValue, yValue); 

}