【问题标题】:Allow user to control height and width of a view by onTouch允许用户通过 onTouch 控制视图的高度和宽度
【发布时间】:2015-06-16 23:58:51
【问题描述】:

我正在尝试实现用户可调整大小的编辑文本视图。当用户拖动视图的边缘时,它可以调整大小。

这是我用于编辑文本的 onTouchListener。我只实现了左边缘的调整大小。我的想法是当用户的触摸事件 x 等于视图的左边距(这意味着用户正在触摸左边缘)时,视图的宽度和左边距会有所不同。

  protected View.OnTouchListener etTouchListener=new View.OnTouchListener() {
           @Override
           public boolean onTouch(View view, MotionEvent event) {
               float x=event.getX();
               float y=event.getY();
               ViewGroup.MarginLayoutParams params=(ViewGroup.MarginLayoutParams)view.getLayoutParams();
               int top=params.topMargin;
               int bottom=params.bottomMargin;
               int left=params.leftMargin;
               int right=params.rightMargin;
               if(x==left){
                   switch (event.getAction()){
                       case MotionEvent.ACTION_DOWN:
                           resize_start(x,y);
                           Log.e("left edge","clicked");
                           break;
                       case MotionEvent.ACTION_MOVE:
                           resize_move(x,y);
                           params.leftMargin=(int)nX;
                           params.width=(int)(editNoteViewParent.getWidth()-nX-params.rightMargin);
                           view.setLayoutParams(params);
                           Log.e("left edge","dragged");
                           break;
                       case MotionEvent.ACTION_UP:
                           break;
                   }
               }  

这是我的 resizeStart():

private void resize_start(float x,float y){
        nX = x;
        nY = y;
    }

还有我的 resizeMove():(当用户拖动边缘时)

private void resize_move(float x, float y){
        float dx = Math.abs(x - nX);
        float dy = Math.abs(y - nY);
        if(dx >=TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE){
          nX = x;
          nY = y;
        }
    }

请帮帮我!非常欢迎有关在用户触摸时调整布局参数大小的相关教程的建议!非常感谢!!

编辑: 我的编辑文本视图是以编程方式创建的。

  private void addEditText(float x,float y){
        RelativeLayout.LayoutParams editTextParams= new RelativeLayout.LayoutParams(200, 200);
        editTextParams.leftMargin=(int)x-(editTextParams.width/2);
        editTextParams.topMargin=(int)y-(editTextParams.height/2);

        mEditText=new EditText(this);
        mEditText.setHint("Enter note");
        mEditText.setBackgroundResource(R.drawable.edittext_shape);
        editNoteViewParent.addView(mEditText, editTextParams);
        mEditText.setOnTouchListener(etTouchListener);
        editNoteViewParent.setOnDragListener(etDragListener);
        editTextCreated=true;
    }

【问题讨论】:

    标签: android view resize layoutparams ontouch


    【解决方案1】:

    更新:

    好的,我忘了看你的把手。用户很难触摸到视图的边缘。试试看:

    布局:

    <EditText
            android:id="@+id/ed_myEdittext"
            android:layout_width="150dp"
            android:layout_height="50dp" />
    

    和代码:

    EditText ed_myEdittext = (EditText) findViewById(R.id.ed_myEdittext);
    ed_myEdittext.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int x=(int)event.getX();
            int y=(int)event.getY();
            int width= v.getLayoutParams().width;
            int height = v.getLayoutParams().height;
    
    
            if((x - width <= 20 && x - width > 0) ||(width - x <= 20 && width - x > 0)){
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Log.e(">>","width:"+width+" height:"+height+" x:"+x+" y:"+y);
                        v.getLayoutParams().width = x;
                        v.getLayoutParams().height = y;
                        v.requestLayout();
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                }
            }
            return false;
         }
     });
    

    【讨论】:

    • 谢谢!让我试一试! :)
    • 嗨,@vandaics 我已经在我的代码中实现了 pxFromDp,并将计算出的宽度分到方法和 setLayoutParams 中,但它仍然无法正常工作。我想问题是我响应用户触摸事件的方式,当用户触摸左边缘时我已将日志添加到代码中,但当我触摸左边缘时日志没有显示。我想在用户触摸并拖动左边缘时调整宽度。
    • 谢谢,但还是不行。当我按下边缘时,日志也没有显示。使用 x-width
    • 您好,用户很难触摸到您视图的边缘。因此,我将范围扩大到 40 像素以便于触摸。
    • 哦,兄弟,谢谢!它奏效了!!:D 因为我也实现了拖动动作,所以很好地处理了这种情况,所以它在第 1 次就可以解决。谢啦!!非常感谢您的帮助!谢谢! @vandaics
    【解决方案2】:
    ((EditText)getActivity().findViewById(R.id.EditText1)).getLayoutParams().height = y;
    ((EditText)getActivity().findViewById(R.id.EditText1)).getLayoutParams().width = x;
    

    如果您没有使用参数WRAP_CONTENTFILL_PARENTMATCH_PARENT,应该这样做。

    【讨论】:

    • 谢谢!您的意思是在代码中添加哪一部分?我在 ACTION_DOWN 事件上添加了日志,但是当我单击左边缘时,日志没有显示,这意味着我的程序甚至没有对边缘的触摸事件做出反应?所以我想问题不是我如何获得参数
    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多