2017-02-23 1 views
1

내 응용 프로그램에서 안드로이드 응용 프로그램을 개발 중입니다. 일부 ImageViews를 동적으로 만들고 해당 ImageView를 RelativeLayout으로 설정합니다. 그래서 레이아웃의 각 이미지를 독립적으로 드래그하고 싶습니다. 이제는 작동하지만 올바르지 않게 이미지를 드래그하면 이미지가 진동하고 천천히 움직입니다. 그리고 핀치 줌을 구현하고 싶었습니다. 가능합니까? 그리고 어떻게 이미지를 움직일 때 진동을 제거 할 수 있습니까? 어떤 사람이 그것을 알고 있다면 좀 도와주세요 ..onTouchListener가 ImageView에서 제대로 작동하지 않습니다.

감사

이 내 onTouchListener()이 RelativeLayout의

으로 이미지를 설정하는 데 사용 내 setCanvasImage() 방법

canvasImage[i].setOnTouchListener(new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 


       x1 = motionEvent.getX(); 
       y1 = motionEvent.getY(); 

       //Log.v("vvvvvv", "" + x1 + " " + y1); 
       final int action = motionEvent.getAction(); 

       switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) { 

        case MotionEvent.ACTION_DOWN: 

         String w = imglayout.getTop() + " " + imglayout.getHeight(); 
         Log.v("wwww", "" + w); 

         x2 = motionEvent.getX(); 
         y2 = motionEvent.getY(); 

         dx = x2 - canvasImage[finalI].getX(); 
         dy = y2 - canvasImage[finalI].getY(); 

         //Log.v("cccccc", "" + x2 + " " + y2); 
         moving = true; 
         break; 
        case MotionEvent.ACTION_UP: 
         moving = false; 
         break; 
        case MotionEvent.ACTION_MOVE: 


         if (moving) { 

          canvasImage[finalI].setX(motionEvent.getX() - dx); 
          canvasImage[finalI].setY(motionEvent.getY() - dy); 

          //Log.v("qqqqqq", "" + canvasImage[finalI].getX()); 
         } 
         break; 
       } 
       //mainLayout.invalidate(); 
       return true; 
      } 

     }); 

입니다

public void setCanvasImage() { 


    int screenSize = getResources().getConfiguration().screenLayout & 
      Configuration.SCREENLAYOUT_SIZE_MASK; 


    final int imgCount = dbobj.getFromTemp(); 
    canvasImage = new ImageView[imgCount]; 
    imglayout = (RelativeLayout) findViewById(R.id.canvas); 

    final String[] strImage = dbobj.getdImage(); 

    imglayout.removeAllViews(); 


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

     canvasImage[i] = new ImageView(this); 
     canvasImage[i].setTag("img_" + i); 
     boolean tabletSize = getResources().getBoolean(R.bool.isTablet); 

     if (tabletSize) { 

      int imgWidth = 130; 
      int imgHeight = 130; 

      RelativeLayout.LayoutParams paramss = new RelativeLayout.LayoutParams(imgWidth, imgHeight); 
      paramss.setMargins(posLeft, posTop, 0, 0); 
      canvasImage[i].setLayoutParams(paramss); 

      canvasImage[i].setScaleType(ScaleType.FIT_XY); 
      canvasImage[i].setTag(strImage[i]); 
      setImage(strImage[i], canvasImage[i]); 
      imglayout.addView(canvasImage[i]); 


     } 
     if(screenSize == Configuration.SCREENLAYOUT_SIZE_NORMAL){ 


      int imgWidth = 100; 
      int imgHeight = 100; 
      RelativeLayout.LayoutParams paramss = new RelativeLayout.LayoutParams(imgWidth, imgHeight); 
      paramss.setMargins(posLeft, posTop, 0, 0); 
      canvasImage[i].setLayoutParams(paramss); 
      canvasImage[i].setTag(strImage[i]); 
      setImage(strImage[i], canvasImage[i]); 
      imglayout.addView(canvasImage[i]); 
     } 

     posLeft = posLeft + 15; 
    } 
} 

relativeativeLayout xml 파일

<RelativeLayout 
    android:layout_below="@+id/btnhorscrolvw" 
    android:layout_width="match_parent" 
    android:layout_height="500dp" 
    android:id="@+id/canvas" 
    android:background="#ffff" 
    android:orientation="horizontal" 
    > 
</RelativeLayout> 
+0

에이 기능을 완벽하게 구현하려면 andoid : clickable = "true" – Ak9637

+0

하지만 작동하지 않습니다. – Astro

답변

1

나는 이것이 효과가 있다고 생각합니다.

float dX, dY; 

@Override 
public boolean onTouch(View view, MotionEvent event) { 

switch (event.getAction()) { 

    case MotionEvent.ACTION_DOWN: 

     dX = view.getX() - event.getRawX(); 
     dY = view.getY() - event.getRawY(); 
     break; 

    case MotionEvent.ACTION_MOVE: 

     view.animate() 
       .x(event.getRawX() + dX) 
       .y(event.getRawY() + dY) 
       .setDuration(0) 
       .start(); 
     break; 
    default: 
     return false; 
} 
return true; 
} 
+0

아 .... 그게 정말로 효과가 있습니다. 귀하의 답변에 감사드립니다. – Astro

0

당신은

imageview.setScaleX(scalefactor); 
imageview.setScaleY(scalefacto); 

안드로이드는 여백 왼쪽 여백 상단을 조정할 수를 확대 핀치를 구현하기위한 이미지 뷰의 scalx 및 scaleY 계수를 사용할 필요로 이미지 뷰 들고 뛰기 위해

당신은 볼 수 있습니다 Move zoom and rotate imageview in android

관련 문제