2013-12-17 5 views
2

Я создаю перетаскивание текстового представления, и мне нужно, чтобы этот текстовый вид также можно было щелкнуть. Мой код согласно ниже:Перетаскивание и OnClick TextView

 <?xml version="1.0" encoding="utf-8"?> 
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/root" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/bg_grey" 
     android:orientation="vertical" > 

     <GridView 
      android:id="@+id/gridview" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="10dp" 
      android:background="@color/bg_grey" 
      android:clickable="true" 
      android:columnWidth="100dp" 
      android:gravity="center" 
      android:horizontalSpacing="10dp" 
      android:numColumns="2" 
      android:stretchMode="columnWidth" 
      android:verticalSpacing="10dp" /> 

     <TextView 
      android:id="@+id/drag_drop_button" 
      android:layout_width="80dp" 
      android:layout_height="80dp" 
      android:layout_marginLeft="255dp" 
      android:layout_marginTop="155dp" 
      android:background="@drawable/circle_button" 
      android:clickable="true" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:gravity="center" 
      android:text="@string/brand" 
      android:textColor="@color/sign_blue" 
      android:textSize="15sp" 
      android:textStyle="bold" /> 

    </FrameLayout> 


class ButtonDragListener implements OnDragListener { 
     Drawable normalShape = getResources().getDrawable(
       R.drawable.circle_button); 

     @Override 
     public boolean onDrag(View v, DragEvent event) { 
      int action = event.getAction(); 
      switch (event.getAction()) { 
      case DragEvent.ACTION_DRAG_STARTED: 
       // do nothing 
       break; 
      case DragEvent.ACTION_DRAG_ENTERED: 
       // do nothing 
       break; 
      case DragEvent.ACTION_DRAG_EXITED: 
       // do nothing 
       break; 
      case DragEvent.ACTION_DROP: 
       // Dropped, reassign View to ViewGroup 
       View view = (View) event.getLocalState(); 
       view.setX(event.getX()); 
       view.setY(event.getY()); 
       ViewGroup owner = (ViewGroup) view.getParent(); 
       owner.removeView(view); 
       FrameLayout container = (FrameLayout) v; 
       container.addView(view); 
       view.setVisibility(View.VISIBLE); 
       break; 
      case DragEvent.ACTION_DRAG_ENDED: 
       // do nothing 
       break; 
      default: 
       break; 
      } 
      return true; 
     } 
    } 

     private final class ButtonTouchListener implements OnTouchListener { 

      private static final int MAX_CLICK_DURATION = 200; 
      private long startClickTime; 

      public boolean onTouch(View view, MotionEvent motionEvent) { 
       if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
        startClickTime = Calendar.getInstance().getTimeInMillis(); 
        ClipData data = ClipData.newPlainText("", ""); 
        DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
          view); 
        view.startDrag(data, shadowBuilder, view, 0); 
        view.setVisibility(View.VISIBLE); 

       } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { 
        long clickDuration = Calendar.getInstance().getTimeInMillis() 
          - startClickTime; 

        if (clickDuration < MAX_CLICK_DURATION){ 
         view.performClick(); 
        } 
       } 
       return true; 
      } 
     } 

     private final class ButtonOnClickListener implements OnClickListener { 

      @Override 
      public void onClick(View v) { 
       Log.e(TAG, "ALOHAAAAA"); 

      } 

     } 

     TextView dragDrop = (TextView) view.findViewById(R.id.drag_drop_button); 
      dragDrop.setAlpha(0.7f); 
      dragDrop.setOnClickListener(new ButtonOnClickListener()); 
      dragDrop.setOnTouchListener(new ButtonTouchListener()); 
     frameLayout = (FrameLayout) view.findViewById(R.id.root); 
     frameLayout.setOnDragListener(new ButtonDragListener()); 

Но MotionEvent.ACTION_UP никогда не назвать, я также пытаюсь переместить view.performClick() внутри MotionEvent_ACTION_DOWN, щелчка слушателя вызова хорошо, но всякий раз, когда я тащу текст просмотра щелчка слушателя также запустить , У меня также есть setOnTouchListener и setOnClickListener прямо из textView, но результат такой же.

Здесь мне нужно плавное перетаскивание, а также функцию щелчка. Пожалуйста, посоветуйте, что я делаю неправильно здесь. Спасибо и очень ценю за любую помощь.

ответ

1

Его уже размещены для дрэг Listener, и вы можете написать для метода TextView setonClickListener ..

Вот ссылка ..

How to drag the TextView to the correct target other TextView

Для OnClick ..

textView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // your code 

     } 
    }); 
+0

Привет, Karthick, спасибо за ваш ответ, но для меня перетаскивание работает нормально. У меня проблема с событием touch, я хочу отличить событие, будет ли пользователь перетаскиваться или просто щелкнуть. С существующим кодом я могу перетащить, но прослушиватель кликов не запускается. –

0

его просто идея, установите onClick для текстового представления в XML и вызовите метод onClick.

android:onClick="onClickTextView" 
public void onClickTextView() 

{ 
// your actions 
} 
+0

Я пробовал ваше предложение выше и до сих пор не решил мою проблему, но спасибо в любом случае за ваш ответ. –

0

Попробуйте это, просто идея. Надеюсь, вы будете работать на вас.

TextView dragDrop = (TextView) view.findViewById(R.id.drag_drop_button); 
dragDrop.setAlpha(0.7f); 
dragDrop.setOnClickListener(new View.OnClickListener() { 

        @Override 
        public void onClick(View arg0) { 
         // TODO Auto-generated method stub 

        } 
       }); 
1

У меня есть решения для моей проблемы, я изменил мой класс ButtonTouchListener согласно ниже:

private final class ButtonTouchListener implements OnTouchListener { 

    private static final float MAX_X_MOVE = 70; 
    private static final float MAX_Y_MOVE = 70; 

    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      ClipData data = ClipData.newPlainText("", ""); 
      DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
        view); 
      view.startDrag(data, shadowBuilder, view, 0); 
      view.setVisibility(View.VISIBLE); 

      float offset_x = motionEvent.getX(); 
      float offset_y = motionEvent.getY(); 


       Log.d(TAG,"OFFSET X = "+offset_x); 
       Log.d(TAG,"OFFSET Y = "+offset_y); 


       if (offset_x < MAX_X_MOVE && offset_y < MAX_Y_MOVE) { 
        Log.d(TAG,"Here we go"); 
        view.performClick(); 
        } 


      return true; 

     } else { 
      return false; 
     } 

    } 

} 

Обратите внимание, что я получаю указатель х и у от события, это поможет мне указать, является ли TextView движется слишком далеко, если он перемещается, чем MAX_X_MOVE, а MAX_Y_MOVE будет рассматриваться как движение перетаскивания. Возможно, это может помочь другим, столкнувшимся с такой же проблемой. Любое лучшее решение, пожалуйста, приветствую :)

3

У меня такая же проблема, как и вы, ваше решение не совсем мне помогает, поэтому я придумал это решение, основанное на вашем предыдущем решении.

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

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      if (Math.abs(event.getX() - mX) < MAX_X_MOVE || Math.abs(event.getY() - mY) < MAX_Y_MOVE) { 
       v.performClick(); 
      } else { 
       ClipData clipData = ClipData.newPlainText("", ""); 
       View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
       v.startDrag(clipData, shadowBuilder, v, 0); 
       v.setVisibility(View.INVISIBLE); 

       mX = event.getX(); 
       mY = event.getY(); 
      } 

      return true; 
     } 
     return false; 
    } 
+1

выше решений работает для меня, но каковы значения, которые вы дали mX, mY, MAX_X_MOVE, MAX_Y_MOVE изначально? –

+0

Работаю для меня тоже .. – NehaK

0

Это своего рода проблема, где хотя предусмотрено решения, но и вы должны думать о том, как эти решения будут соответствовать вашим потребностям. Для моего случая я использовал вышеизложенные идеи и придумал свое собственное решение, которое соответствует моим потребностям.

/** 
    * Max value of X to move before we declare that we are going to do 
    * drag. 
    */ 
    private static final float MAX_X_MOVE = 120; 

    /** 
    * Max value of Y to move before we declare that we are going to do 
    * drag. 
    */ 
    private static final float MAX_Y_MOVE = 120; 

    private final static int NONE = 0; 

    private final static int DRAG = 1; 

    private int m_mode = NONE; 

    icon.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     final int action = event.getAction(); 

     switch (action){ 
      case MotionEvent.ACTION_DOWN: 
      m_mode = NONE; 
      break; 

      case MotionEvent.ACTION_MOVE: 
      if (Math.abs(event.getX()) > MAX_X_MOVE || 
       Math.abs(event.getY()) > MAX_Y_MOVE) { 
       m_mode = DRAG; 
       _startDragOnFling(); 
      } 
      break; 

      case MotionEvent.ACTION_UP: 
       if(m_mode == DRAG){ 
       break; 
       } 
       v.performClick(); 
      break; 
     } 

     return true; 
     } 
    }); 
Смежные вопросы