2011-08-26 19 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,它不適合我,classCastexception for viewGroup/frameLayout/linear, 實際上我在我的xml中使用Linear,有2個子視圖,圖像和文本,我想移動子項, –

+0

它不適合我,ClassCastException,我可能沒有完全按照我應該設置Layouts, 實際上我正在使用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

請幫我,我被卡住了。 –