可拖动按钮走出RelativeLayout的,每当拖累 [英] Draggable Button getting out of RelativeLayout whenever dragged
问题描述
我正在开发中,我使用拖放
功能的应用程序。
在此我生成按钮的OnClick
.The code工作正常,但是当我拖
的按钮
来的角落 RelativeLayout的
,按键失控的布局
。我希望它留在布局内
。
之前拖动按钮
拖动按钮(上角在这个例子中)后
正如你可以看到按钮
是失控的布局
每当我拖
对布局
,我希望它留在布局年底/角落它
完好,显示全按钮
。我该怎么办呢?
在此先感谢!
MainActivity.java
公共类MainActivity扩展活动实现OnTouchListener {
按钮btnAddButton;
RelativeLayout的RL1;
INT I = 1;
私人诠释_xDelta;
私人诠释_yDelta;
ViewGroup中_root;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
btnAddButton =(按钮)findViewById(R.id.btnAdd);
RL1 =(RelativeLayout的)findViewById(R.id.relative_layout);
_root =(ViewGroup中)findViewById(R.id.relative_layout);
btnAddButton.setOnClickListener(新OnClickListener(){
@覆盖
公共无效的onClick(视图v){
加(V);
}
});
}
公共无效添加(视图v){
按钮BTN =新按钮(MainActivity.this);
//btn.setId(i);
RelativeLayout.LayoutParams layoutParam =新RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
INT一个=(int)的(的Math.random()* 100);
// Toast.makeText(MainActivity.this,将String.valueOf(的Math.random()* 100),1).show(); //双重一个=的Math.random();
layoutParam.leftMargin = 30 + A;
如果(ⅰ→1){
layoutParam.addRule(RelativeLayout.BELOW中,(i - 1));
}
btn.setText(按钮+ I);
rl1.addView(BTN,layoutParam);
btn.setOnTouchListener(本);
我++;
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
。getMenuInflater()膨胀(R.menu.main,菜单);
返回true;
}
@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
最终诠释X =(INT)event.getRawX();
最终诠释Y =(INT)event.getRawY();
开关(event.getAction()及MotionEvent.ACTION_MASK){
案例MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams =(RelativeLayout.LayoutParams)v.getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
打破;
案例MotionEvent.ACTION_UP:
打破;
案例MotionEvent.ACTION_POINTER_DOWN:
打破;
案例MotionEvent.ACTION_POINTER_UP:
打破;
案例MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams的LayoutParams =(RelativeLayout.LayoutParams)v.getLayoutParams();
layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
v.setLayoutParams(的LayoutParams);
打破;
}
_root.invalidate();
返回true;
}
}
activity_main.xml
< RelativeLayout的的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:ID =@ + ID / linear_layout
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT>
<按钮
机器人:ID =@ + ID / btnAdd
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:的onClick =Add按钮
机器人:文本=按钮/>
< RelativeLayout的
机器人:ID =@ + ID / relative_layout
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_alignParentBottom =真
机器人:layout_alignParentRight =真
机器人:layout_alignParentTop =真
机器人:layout_toRightOf =@ + ID / btnAdd>
< / RelativeLayout的>
< / RelativeLayout的>
我可以利用这些条件来解决这样的:
IF((v.getY()< lay.getY())){
v.setX(XVAL);
v.setY(利用yval);
}否则如果(v.getX()&其中; lay.getX()){
v.setX(XVAL);
v.setY(利用yval);
}否则如果(v.getX()+ v.getWidth()> lay.getX()+ lay.getWidth()){
v.setX(XVAL);
v.setY(利用yval);
}否则如果(v.getY()+ v.getHeight()> lay.getY()+ lay.getHeight()){
v.setX(XVAL);
v.setY(利用yval);
} 其他 {
的for(int i = 0; I< = viewIdList.size() - 1;我++){
如果(v.getId()!= viewIdList.get(ⅰ).getId()){
视图V3 = viewIdList.get(ⅰ);
矩形Rect1的=新的矩形(v.getLeft(),v.getTop()
v.getRight(),v.getBottom());
v.getHitRect(Rect1的);
矩形RECT2 =新的矩形(v3.getLeft(),v3.getTop()
v3.getRight(),v3.getBottom());
v3.getHitRect(RECT2);
如果(Rect.intersects(Rect1的,RECT2)){
的System.out.println(重叠);
v.setX(XVAL);
v.setY(利用yval);
}
其中v是(在我的情况的ImageView)认为,这code是写在 MotionEvent.ACTION_UP onTouchListener的。
I am developing an application in which I am using Drag and Drop
functionality.
In that I am generating buttons OnClick
.The code is working fine but when I drag
the button
to the corners of the relativelayout
,button gets out of the layout
. I want it to stay inside of the layout
.
Before Dragging the button
After Dragging the button (on top corner in this example)
As you can see that the button
is getting out of the layout
whenever I drag
it towards the end/corner of the layout
, I want it to stay in the layout
intact, display full button
. How can I do that?
Thanks in advance.!
MainActivity.java
public class MainActivity extends Activity implements OnTouchListener {
Button btnAddButton;
RelativeLayout rl1;
int i = 1;
private int _xDelta;
private int _yDelta;
ViewGroup _root;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnAddButton = (Button) findViewById(R.id.btnAdd);
rl1 = (RelativeLayout) findViewById(R.id.relative_layout);
_root = (ViewGroup)findViewById(R.id.relative_layout);
btnAddButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
add(v);
}
});
}
public void add(View v) {
Button btn = new Button(MainActivity.this);
//btn.setId(i);
RelativeLayout.LayoutParams layoutParam = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
int a=(int) (Math.random()*100);
// Toast.makeText(MainActivity.this, String.valueOf(Math.random()*100), 1).show();//double a=Math.random();
layoutParam.leftMargin = 30+a;
if (i > 1) {
layoutParam.addRule(RelativeLayout.BELOW, (i - 1));
}
btn.setText("Button" + i);
rl1.addView(btn, layoutParam);
btn.setOnTouchListener(this);
i++;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
v.setLayoutParams(layoutParams);
break;
}
_root.invalidate();
return true;
}
}
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<Button
android:id="@+id/btnAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="AddButton"
android:text="Button" />
<RelativeLayout
android:id="@+id/relative_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/btnAdd" >
</RelativeLayout>
</RelativeLayout>
I was able to tackle this by using these conditions:
if ((v.getY() < lay.getY())) {
v.setX(xVal);
v.setY(yVal);
} else if (v.getX() < lay.getX()) {
v.setX(xVal);
v.setY(yVal);
} else if (v.getX() + v.getWidth() > lay.getX() + lay.getWidth()) {
v.setX(xVal);
v.setY(yVal);
} else if (v.getY() + v.getHeight() > lay.getY() + lay.getHeight()) {
v.setX(xVal);
v.setY(yVal);
} else {
for (int i = 0; i <= viewIdList.size() - 1; i++) {
if (v.getId() != viewIdList.get(i).getId()) {
View v3 = viewIdList.get(i);
Rect rect1 = new Rect(v.getLeft(), v.getTop(),
v.getRight(), v.getBottom());
v.getHitRect(rect1);
Rect rect2 = new Rect(v3.getLeft(), v3.getTop(),
v3.getRight(), v3.getBottom());
v3.getHitRect(rect2);
if (Rect.intersects(rect1, rect2)) {
System.out.println("overlap");
v.setX(xVal);
v.setY(yVal);
}
where v is the view (ImageView in my case) and this code is written in MotionEvent.ACTION_UP of onTouchListener.
这篇关于可拖动按钮走出RelativeLayout的,每当拖累的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!