2015-03-02 35 views
0

我想在EditText上實現拖動和雙擊事件,但我只能實現兩者中的任意一個。這背後的想法是當用戶雙擊編輯文本時編輯文本變爲啓用,並且拖動他可以拖動它,無論他想要什麼。實現在同一視圖上拖動和雙擊android

text.setOnTouchListener(new OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 
       // TODO Auto-generated method stub 
       if(gestureDetector.onTouchEvent(event)==true && gestureDetector!=null){ 
        return gestureDetector.onTouchEvent(event); 
       } 
       else 
       {drag(event, v); 
       return true; } 
      } 

      private void drag(MotionEvent event, View v) { 
       // TODO Auto-generated method stub 
       RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) v 
         .getLayoutParams(); 

       switch (event.getAction()) { 
       case MotionEvent.ACTION_MOVE: { 
        params.topMargin = (int) event.getRawY() - (v.getHeight()); 
        params.leftMargin = (int) event.getRawX() 
          - (v.getWidth()/2); 
        v.setLayoutParams(params); 
        break; 
       } 
       case MotionEvent.ACTION_UP: { 
        params.topMargin = (int) event.getRawY() - (v.getHeight()); 
        params.leftMargin = (int) event.getRawX() 
          - (v.getWidth()/2); 
        v.setLayoutParams(params); 
        break; 
       } 
       case MotionEvent.ACTION_DOWN: { 
        v.setLayoutParams(params); 
        break; 
       } 
       } 
      } 
     }); 

回答

0

我已經得到了解決

// TODO Auto-generated method stub 

      int X = (int) event.getRawX(); 
      int Y = (int) event.getRawY(); 
      layoutParams = (FrameLayout.LayoutParams) v.getLayoutParams(); 

      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       FrameLayout.LayoutParams lParams = (FrameLayout.LayoutParams) v 
         .getLayoutParams(); 
       _xDelta = X - lParams.leftMargin; 
       _yDelta = Y - lParams.topMargin; 

       startTime = System.currentTimeMillis(); 
       if (upCounter != 0) { 
        timeBetweenTwoClick = startTime - endTime; 
       } 

       mSingleStart = System.currentTimeMillis(); 

       break; 
      case MotionEvent.ACTION_UP: 
       endTime = System.currentTimeMillis(); 
       mSingleEnd = System.currentTimeMillis(); 
       currentClickTime = endTime - startTime; 
       consecutiveTwoClickTime = currentClickTime 
         + previousClickTime; 

       // textview single tap detection 
       if (mSingleEnd - mSingleStart <= mSingleTimeDiffrence) { 
        Toast.makeText(MainActivity.this, "tap", 1500).show(); 

        if (mSingleCount == false) { 
         GradientDrawable gd = new GradientDrawable(); 
         gd.setCornerRadius(5); 
         gd.setStroke(3, 0xFF000000); 
         text.setBackgroundDrawable(gd); 
         verticalSeekBar.setVisibility(View.VISIBLE); 
         verticalSeekBar 
           .setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

            @Override 
            public void onStopTrackingTouch(
              SeekBar seekBar) { 
             // TODO Auto-generated method 
             // stub 

            } 

            @Override 
            public void onStartTrackingTouch(
              SeekBar seekBar) { 
             // TODO Auto-generated method 
             // stub 

            } 

            @Override 
            public void onProgressChanged(
              SeekBar seekBar, int progress, 
              boolean fromUser) { 
             // TODO Auto-generated method 
             // stub 
             text.setTextSize(progress + 20); 
             text2.setTextSize(progress + 20); 
            } 
           }); 

         mSingleCount = true; 
        } else { 
         text.setBackgroundDrawable(null); 
         mSingleCount = false; 
         verticalSeekBar.setVisibility(View.INVISIBLE); 
        } 

       } 

       if (upCounter == 0) { 
        ++upCounter; 
        previousClickTime = currentClickTime; 
       } 

       else { 
        previousClickTime = currentClickTime; 
        if ((consecutiveTwoClickTime + timeBetweenTwoClick) <= doubleClickTimeDiffrence) { 

         if (layoutParams != null) 
          text2.setLayoutParams(layoutParams); 

         text2.setVisibility(View.VISIBLE); 
         text2.requestFocus(); 

         if (text2.getText().toString() 
           .equalsIgnoreCase("enter by double tap")) { 
          text2.setText(""); 

         } 
         InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
         imm.showSoftInput(text2, 
           InputMethodManager.SHOW_IMPLICIT); 
         text.setVisibility(View.INVISIBLE); 

         Toast.makeText(MainActivity.this, "double tap", 
           1500).show(); 
        } 

       } 
       break; 
      case MotionEvent.ACTION_POINTER_DOWN: 
       break; 
      case MotionEvent.ACTION_POINTER_UP: 
       break; 
      case MotionEvent.ACTION_MOVE: 

       layoutParams.leftMargin = X - _xDelta; 
       layoutParams.topMargin = Y - _yDelta; 
       if (layoutParams.leftMargin < 0) { 
        layoutParams.leftMargin = 20; 
       } else if (layoutParams.leftMargin > mainimage.getWidth()) { 
        layoutParams.leftMargin = mainimage.getWidth() - 20; 
       } 
       if (layoutParams.topMargin < 0) { 
        layoutParams.topMargin = 20; 
       } else if (layoutParams.topMargin > mainimage.getHeight() - 100) { 
        text.setText(text2.getText().toString()); 
        layoutParams.topMargin = mainimage.getHeight() - 90 
          - text.getHeight(); 
        // layoutParams.leftMargin = 20; 
       } 

       text.setX(layoutParams.leftMargin); 
       text.setY(layoutParams.topMargin); 

       v.setLayoutParams(text.getLayoutParams()); 

       Log.i("mainimage.getHeight() ", 
         (mainimage.getHeight() - 60) + " " 
           + layoutParams.topMargin + " " 
           + text.getHeight()); 

       // if (text.getLeft() >= 0 && text.getTop() >= 0 
       // && text.getRight() < width 
       // && text.getBottom() < mainimage.getHeight()) { 
       // 
       // text.setX(layoutParams.leftMargin); 
       // text.setY(layoutParams.topMargin); 
       // } else if (text.getTop() < 0) { 
       // 
       // text.setX(layoutParams.leftMargin); 
       // text.setY(10); 
       // } else if (text.getBottom() > mainimage.getHeight()) { 
       // text.setX(layoutParams.leftMargin); 
       // text.setY(mainimage.getHeight() - 50); 
       // } else if (text.getLeft() < 0) { 
       // text.setX(10); 
       // text.setY(layoutParams.topMargin); 
       // } else if (text.getRight() > mainimage.getWidth()) { 
       // 
       // text.setX(mainimage.getWidth() - 10); 
       // text.setY(layoutParams.topMargin); 
       // } 
       // else { 
       // text.setX(20); 
       // text.setY(20); 
       // } 

       // layoutParams.rightMargin = -250; 
       // layoutParams.bottomMargin = -250; 

       // if (text.getWidth() < (width - 50)) { 
       // 
       // } 

       // text.setWidth(width - text.getLeft()); 

       // Log.i("From Current position: ", 
       // "Left Margin: " + X + " " + _xDelta 
       // + "Left Margin: " + Y + " " + _yDelta 
       // + "layoutParams.leftMargin: " 
       // + layoutParams.leftMargin 
       // + " layoutParams.topMargin: " 
       // + layoutParams.topMargin 
       // + " layoutParams.height - width: " 
       // + layoutParams.height + " " + width 
       // + " " + (width - text.getWidth()) + " " 
       // + text.getWidth()); 
       break;