최종 위치 좌표가 내보기에 있으면 버튼을 이동하고 싶습니다. 그래서 초기 클릭 (ACTION_DOWN)을 저장하여 클릭에서 이동을 구별 할 수 있지만, 뭔가 잘못되었습니다. 움직이는 이벤트에서 날아가는 나의 버튼! 클릭이 전혀 작동하지 않습니다. 내 주요 목표는보기 (화면/창) 밖으로 이동 버튼을 방지하는 것입니다.플로트 동작 버튼 처리 (내부 레이아웃 즉, 사용자에게 표시됨) OnTouchListener로 클릭하고
제 생각에 Outlocation
에서 뷰 경계로 얻는 좌표가 잘못된 것입니다. 또는 setX()/setY()
은 내가 가지고있는 픽셀과 비교할 때 호환되지 않는 매개 변수를 사용합니다. 여기
b = (FloatingActionButton) view.findViewById(R.id.fab);
b.setOnTouchListener(new View.OnTouchListener() {
float x, y;
float[] Outlocation = new float[2];
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
float new_x = event.getRawX() ;
float new_y = event.getRawY();
// v.getLocationOnScreen(Outlocation);
DisplayMetrics metrics = getResources().getDisplayMetrics();
Outlocation[0] = metrics.widthPixels;
Outlocation[1] = metrics.heightPixels;
if (new_x > Outlocation[0]) {
new_x = x ;
} else if (new_x < 0) {
new_x = x;
}
if (new_y > Outlocation[1]) {
new_y = y;
} else if (new_y < 0) {
new_y = y;
}
b.setX(b.getX() + (new_x - x));
b.setY(b.getY() + (new_y - y));
return true;
case MotionEvent.ACTION_DOWN:
x = event.getRawX();
y = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
if(x == event.getRawX() & (y == event.getRawY())) {
//Handle Click Event
Intent intent = new Intent(getContext(), AddActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
MainActivity.Gone = true;
MainActivity.setTab = 1;
return true;
}
}
return false;
}
});
업데이트 : 사용자 지정 레이아웃 내가 처음에 버튼을 이동하려는 이유는 메시지 목록의 일부를 포함하기 때문 데니스의 대답은 작동하지 않습니다 사용자가 메시지의 일부를 읽을 수 있도록 배치하십시오.
"보기"란 무엇을 의미합니까? 전체 화면 또는 레이아웃의 특정보기? –
나는 Relativelayout 또는 Framelayout과 같은 어떤 것도 될 수있는 버튼의 부모보기를 의미했습니다 .... –
그러면 DisplayMetrics를 사용하는 이유는 무엇입니까? 예를 들어 높이가 1920이고 전체 HD 장치가 1080 너비와 같이 전체 장치 화면 픽셀을 제공합니다. 상위 뷰의 높이와 너비를 가져 와서 부모 뷰 경계 내에서 움직임 만 허용하려는 경우 외부 할당에 값을 입력하면됩니다. –