How to move the text view?

2019-04-11 14:06发布

问题:

I have textview and imageview in the frame layout, i want move the text along with finger on the image.

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

i try some code but it's not working properly tell me the correct way.

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

回答1:

i got answer by using this code

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


回答2:

Check this code snippet,

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