0

모바일 장치의 해상도에 따라 하나의 이미지가 전체 화면에서 자동으로 움직이는 것을 확인하려고합니다. 이제 클릭 또는 터치 이벤트가 필요합니다. 나는 여러 가지를 심판했지만 관련 답변을 찾을 수 없었다. 내가 안드로이드에서 참조 할 수 있도록 관련 예제가 있나요?안드로이드에서 터치 이벤트로 이미지를 움직입니까?

+0

'자동으로 이동 중 '이란 사용자가'처리기 '를 사용하고 있다는 것을 의미합니까 ?? 그리고 당신은'onTouch()'이벤트를 구현할 수 있습니다. – Piyush

+0

많은 스크롤 가능한 항목에는 머리글과 바닥 글이 내장되어 있으므로 구현하면 자신의 요소를 넣을 수 있습니다. –

+0

나는 그것에 대해 모른다. 어떻게 사용하는지 알려주시겠습니까? @PiyushGupta –

답변

0

다음 코드를 사용하여 이미지를 이동하십시오. 사용 중이며 잘 작동합니다. 활동에서

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

public class Touch 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_INDEX_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 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); 
    } 
} 

노트 ->

는 imageview.setOnTouchListener를 수행하여이 수신기를 연결 (새 터치());

+0

MainActivity에이 클래스를 어떻게 구현할 수 있습니까? @SANJAYGUPTA –

+0

간단한 복사로이 클래스를 패키지에 붙여넣고 imageview.setOnTouchListener (new Touch()); 귀하의 oncreate 방법 –

+0

도와 줘서 고마워하지만, 내가 한 짓을하지만 이미지가 움직이지 않습니다. @SANJAYGUPTA –

0
public class MainActivity extends Activity implements View.OnTouchListener { 

    // these matrices will be used to move and zoom image 
    private Matrix matrix = new Matrix(); 
    private Matrix savedMatrix = new Matrix(); 
    // we can be in one of these 3 states 
    private static final int NONE = 0; 
    private static final int DRAG = 1; 
    private static final int ZOOM = 2; 
    private int mode = NONE; 
    // remember some things for zooming 
    private PointF start = new PointF(); 
    private PointF mid = new PointF(); 
    private float oldDist = 1f; 
    private float d = 0f; 
    private float newRot = 0f; 
    private float[] lastEvent = null; 
    private ImageView view, fin; 
    private Bitmap bmap; 
FrameLayout frm; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     view = (ImageView) findViewById(R.id.imageView); 
     fin = (ImageView) findViewById(R.id.imageView1); 
     view.setOnTouchListener(this); 
frm=(FrameLayout)findViewById(R.id.frm); 

    } 
public boolean onTouch(View v, MotionEvent event) { 
     // handle touch events here 
     view = (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: 
       oldDist = spacing(event); 
       if (oldDist > 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) { 
        matrix.set(savedMatrix); 
        float dx = event.getX() - start.x; 
        float dy = event.getY() - start.y; 
        matrix.postTranslate(dx, dy); 
       } 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); 
        } 
        if (lastEvent != null && event.getPointerCount() == 2 || event.getPointerCount() == 3) { 
         newRot = rotation(event); 
         float r = newRot - d; 
         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); 
        } 
       } 
       break; 
     } 

     view.setBackgroundResource(R.mipmap.ic_launcher); 
     view.setImageMatrix(matrix); 

     bmap= Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.RGB_565); 
     Canvas canvas = new Canvas(bmap); 
     view.draw(canvas); 

     //fin.setImageBitmap(bmap); 
     return true; 
    } 


    public void ButtonClick(View v){ 

     fin.setImageBitmap(bmap); 
    } 
    /** 
    * 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); 
     float s=x * x + y * y; 
     return (float)Math.sqrt(s); 
    } 

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

    /** 
    * Calculate the degree to be rotated by. 
    * 
    * @param event 
    * @return Degrees 
    */ 
    private float rotation(MotionEvent event) { 
     double delta_x = (event.getX(0) - event.getX(1)); 
     double delta_y = (event.getY(0) - event.getY(1)); 
     double radians = Math.atan2(delta_y, delta_x); 
     return (float) Math.toDegrees(radians); 
    } 
} 

-> 시도해보십시오.

관련 문제