允许用户通过 onTouch 控制视图的高度和宽度
Allow user to control height and width of a view by onTouch
我正在尝试实现用户可调整大小的编辑文本视图。当用户拖动视图的边缘时可以调整它的大小。
这是我的 onTouchListener for edittext。我只实现了左边缘的大小调整。我的想法是因为用户的触摸事件 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;
}
((EditText)getActivity().findViewById(R.id.EditText1)).getLayoutParams().height = y;
((EditText)getActivity().findViewById(R.id.EditText1)).getLayoutParams().width = x;
如果您没有使用参数 WRAP_CONTENT
、FILL_PARENT
和 MATCH_PARENT
,应该这样做。
更新:
好的,我忘记看你的句柄了。用户很难触摸到视图的边缘。让我们试试:
布局:
<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;
}
});
我正在尝试实现用户可调整大小的编辑文本视图。当用户拖动视图的边缘时可以调整它的大小。
这是我的 onTouchListener for edittext。我只实现了左边缘的大小调整。我的想法是因为用户的触摸事件 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;
}
((EditText)getActivity().findViewById(R.id.EditText1)).getLayoutParams().height = y;
((EditText)getActivity().findViewById(R.id.EditText1)).getLayoutParams().width = x;
如果您没有使用参数 WRAP_CONTENT
、FILL_PARENT
和 MATCH_PARENT
,应该这样做。
更新:
好的,我忘记看你的句柄了。用户很难触摸到视图的边缘。让我们试试:
布局:
<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;
}
});