2011-08-26 6 views
3

프레임 레이아웃에 textview 및 imageview가 있습니다. 이미지의 손가락과 함께 텍스트를 이동하고 싶습니다.텍스트보기를 이동하는 방법은 무엇입니까?

<FrameLayout 
    android:id="@+id/framelayout" 
    android:layout_marginTop="30dip" 
    android:layout_height="fill_parent" 
    android:layout_width="fill_parent"> 

    <ImageView 
      android:id="@+id/ImageView01" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content"/> 

    <TextView android:id="@+id/text_view" 
      android:layout_marginTop="30dip" 
      android:layout_width="wrap_content" 
      android:maxLines="20" 
      android:scrollbars="vertical" 
      android:layout_height="wrap_content"/> 

</FrameLayout> 

몇 가지 코드를 시도하지만 올바르게 작동하지 않습니다.

public boolean onTouch(View v, MotionEvent event) { 

    float x1 = 0, x2, y1 = 0, y2; 
    String direction; 
    switch(event.getAction()) { 
      case(MotionEvent.ACTION_DOWN): 
       x1 = event.getX(); 
       y1 = event.getY(); 

       break; 
      case(MotionEvent.ACTION_UP): { 
       x2 = event.getX(); 
       y2 = event.getY(); 
       float dx = x2-x1; 
       float dy = y2-y1; 

        // Use dx and dy to determine the direction 
       if(Math.abs(dx) > Math.abs(dy)) { 
        if(dx>0) direction = "right"; 
        else direction = "left"; 
       } else { 
        if(dy>0) direction = "down"; 
        else direction = "up"; 
       } 
      } 

    } 
    return false; 
} 
+0

왜 애니메이션을 사용하지 않는를 사용하여 대답을 얻었다 ??? – PedroAGSantos

+0

위의 코드가 작동하지 않습니까? 와트 문제가 점점? 오류를 게시 할 경우? – Randroid

+0

오류가 아니며, 로그에 아무것도 표시되지 –

답변

5

는이 코드

vg = (ViewGroup)findViewById(R.id.vg); 
    vg.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getActionMasked()) 
      { 
      case MotionEvent.ACTION_MOVE: 
       int x = (int)event.getX() - offset_x; 
       int y = (int)event.getY() - offset_y; 
       int w = getWindowManager().getDefaultDisplay().getWidth(); 
       int h = getWindowManager().getDefaultDisplay().getHeight(); 
       if(x > w) 
        x = w; 
       if(y > h) 
        y = h; 
       LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
           new ViewGroup.MarginLayoutParams(
           LinearLayout.LayoutParams.FILL_PARENT, 
           LinearLayout.LayoutParams.FILL_PARENT)); 
       lp.setMargins(x, y, 0, 0); 
       selected_item.setLayoutParams(lp); 
       break; 
      default: 
       break; 
      } 
     return true; 
    } 
}); 
    tv = (TextView)findViewById(R.id.text_view2); 
    tv.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getActionMasked()) 
     { 
     case MotionEvent.ACTION_DOWN: 
      offset_x = (int)event.getX(); 
      offset_y = (int)event.getY(); 
      selected_item = v; 
      break; 
     default: 
      break; 
     }        
     return false; 
    } 
    }); 
}  
+0

#RajaReddy, 나를 위해 일하지 않는 viewGroup/frameLayout/linear에 대한 classCastexception 실제로 2 차원 뷰, 이미지 및 텍스트로 된 리니어를 사용하고 있습니다. 둘 다 자식을 옮기고 싶습니다. –

+0

나를 위해 작동하지 않습니다. , ClassCastException, 정확히 내가 가정 한대로 레이아웃을 설정하지 않을 수도 있습니다. 실제로 FrameLayout과 Linear를 사용하고 있고, 부모가되어야하고 아이가 무엇인지 알아볼 수 없습니다. 텍스트가 포함 된 이미지를 특정 화면 영역 내에서 이동하려는 경우 (예 : 반쪽 화면 내에서) –

0

확인이 코드,

@Override 
    public boolean onTouchEvent(MotionEvent ev) { 
    final int action = ev.getAction(); 
    final int x = (int) ev.getX(); 
    final int y = (int) ev.getY(); 

    if (action == MotionEvent.ACTION_DOWN && x < this.getWidth()/4) { 
     mDragMode = true; 
    } 

    if (!mDragMode) 
     return super.onTouchEvent(ev); 

    switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      mStartPosition = pointToPosition(x,y); 
      if (mStartPosition != INVALID_POSITION) { 
       int mItemPosition = mStartPosition - getFirstVisiblePosition(); 
       mDragPointOffset = y - getChildAt(mItemPosition).getTop(); 
       mDragPointOffset -= ((int)ev.getRawY()) - y; 
       startDrag(mItemPosition,y); 
       drag(0,y);// replace 0 with x if desired 
      } 
      break; 
     case MotionEvent.ACTION_MOVE: 
      drag(0,y);// replace 0 with x if desired 
      break; 
     case MotionEvent.ACTION_CANCEL: 
     case MotionEvent.ACTION_UP: 
     default: 
      mDragMode = false; 
      mEndPosition = pointToPosition(x,y); 
      stopDrag(mStartPosition - getFirstVisiblePosition()); 
      if (mDropListener != null && mStartPosition != INVALID_POSITION && mEndPosition != INVALID_POSITION) 
       mDropListener.onDrop(mStartPosition, mEndPosition); 
      break; 
    } 
    return true; 
} 

// move the drag view 
private void drag(int x, int y) { 
    if (mDragView != null) { 
     WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) mDragView.getLayoutParams(); 
     layoutParams.x = x; 
     layoutParams.y = y - mDragPointOffset; 
     WindowManager mWindowManager = (WindowManager) getContext() 
       .getSystemService(Context.WINDOW_SERVICE); 
     mWindowManager.updateViewLayout(mDragView, layoutParams); 

     if (mDragListener != null) 
      mDragListener.onDrag(x, y, null);// change null to "this" when ready to use 
    } 
} 

// enable the drag view for dragging 
private void startDrag(int itemIndex, int y) { 
    stopDrag(itemIndex); 

    View item = getChildAt(itemIndex); 
    if (item == null) return; 
    item.setDrawingCacheEnabled(true); 
    if (mDragListener != null) 
     mDragListener.onStartDrag(item); 

    // Create a copy of the drawing cache so that it does not get recycled 
    // by the framework when the list tries to clean up memory 
    Bitmap bitmap = Bitmap.createBitmap(item.getDrawingCache()); 

    WindowManager.LayoutParams mWindowParams = new WindowManager.LayoutParams(); 
    mWindowParams.gravity = Gravity.TOP; 
    mWindowParams.x = 0; 
    mWindowParams.y = y - mDragPointOffset; 

    mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT; 
    mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT; 
    mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
      | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 
      | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
      | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 
      | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 
    mWindowParams.format = PixelFormat.TRANSLUCENT; 
    mWindowParams.windowAnimations = 0; 

    Context context = getContext(); 
    ImageView v = new ImageView(context); 
    v.setImageBitmap(bitmap);  

    WindowManager mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 
    mWindowManager.addView(v, mWindowParams); 
    mDragView = v; 
} 

// destroy drag view 
private void stopDrag(int itemIndex) { 
    if (mDragView != null) { 
     if (mDragListener != null) 
      mDragListener.onStopDrag(getChildAt(itemIndex)); 
     mDragView.setVisibility(GONE); 
     WindowManager wm = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE); 
     wm.removeView(mDragView); 
     mDragView.setImageDrawable(null); 
     mDragView = null; 
    } 
} 
+0

호출하는 함수는 무엇입니까 (올바른 tv.setOntouchListener()). –

+0

제발 저를 도와주세요. –

관련 문제