2016-05-11 3 views
0

Как ограничить просмотр изображений от перетаскивания экрана?Как ограничить просмотр изображений от перетаскивания экрана?

ява файл цвета границы 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); 

изображение выходит из экрана я хочу ImageView к remian в внутри макета

touch1 класса я использовал для перемещения и увеличение и уменьшение изображения.

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

ответ

0

Вы можете попробовать ниже код внутри onTouch метода с case MotionEvent.ACTION_MOVE:

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

Try, чтобы изменить его и проверить, работает ли он.

+0

tauqir ... сравнение зрения идентификатор, как можно предотвратить затягивание экрана? или я не знаю, как реализовать ваше предложение. Можете ли вы сделать это для меня или разработать, пожалуйста? – newpie

+0

Сравнение идентификаторов просмотра даст идентификатор перетаскивания. Если вы не хотите перетащить «TestImage», тогда получите свой идентификатор и ничего не сделайте. Это гарантирует, что ваш 'TestImage' не будет перетаскиваться. – Tauqir

0

Вы можете поставить, если состояние как

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; 
     } 

Кроме того, имея этот код в ACTION_MOVE кажется достаточно.

+0

что такое параметры здесь ... поскольку я получаю param - это линейные макеты высоты и веса, так как я могу получить этот параметр в классе Touch? – newpie

+0

было бы очень признательно, если бы вы вносили изменения в мой код упоминания выше, потому что, как новый для Android и загружаемый код, его сложно сделать самостоятельно. – newpie

0

Я создал этот код, и до сих пор работает, как я вижу в вашем коде, мы используем то же имя для переменных, так что вы можете просто скопировать вставить его:

случай MotionEvent.ACTION_MOVE:

if (режим == 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); 

}

Смежные вопросы