Здравствуйте, я работаю с пользовательскими представлениями.Этот класс работает, и вы можете использовать его, чтобы провести фрагмент, который был установлен в этом макете, вниз, чтобы закрыть его.Это мой первый пользовательский вид, который я когда-либо делал.Я действительно не знаю, должно ли это быть сделано, но я столкнулся с проблемой.Когда структура кадра содержит фрагмент, и этот фрагмент также содержит эту структуру кадра.Мне нужен способ, как правильно отправить событие на текущий видимый вид для пользователя.Теперь оба метода dispatchTouchEvents () были вызваны.Но это не то, что я хочу.Это должен быть только метод из текущего видимого фрагмента для пользователя.Таким образом, вам придется провести 2 раза, чтобы закрыть оба, а не только 1 раз и его закрытие одновременно.И я думаю, что я неправильно использую систему касания Android.
public class DragableViewFragment extends FrameLayout
{
private AppCompatActivity activity;
private FragmentManager fragmentManager;
private static final float KILL_WEIGHT = 0.50f;
private static final float SENSITIVITY = 1.5f;
private static float IGNORED_CASE; //Pixels
public DragableViewFragment(Context context) {
super(context);
initDimensions(context);
}
public DragableViewFragment(Context context, AttributeSet attrs) {
super(context, attrs);
initDimensions(context);
}
public DragableViewFragment(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initDimensions(context);
}
@RequiresApi(21)
public DragableViewFragment(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initDimensions(context);
}
private float max_height;
private float down_WeightPercent;
private void initDimensions(Context context)
{
if(context instanceof AppCompatActivity)
{
this.activity = (AppCompatActivity) context;
this.fragmentManager = this.activity.getSupportFragmentManager();
}
else
{
throw new IllegalArgumentException("View is not used in a Activity context.");
}
final ViewConfiguration configuration = ViewConfiguration.get(context);
DragableViewFragment.IGNORED_CASE = configuration.getScaledPagingTouchSlop();
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
if(wm != null)
{
Display defaultDisplay = wm.getDefaultDisplay();
Point point = new Point();
defaultDisplay.getSize(point);
max_height = point.y;
down_WeightPercent = (float) (max_height - (max_height * DragableViewFragment.KILL_WEIGHT));
}
else
{
throw new NullPointerException("WindowManager_service NULL");
}
}
private boolean isDragging = false;
private float lastRawY = -1;
private float lastRawX = -1;
private float lastDragDistance;
private float firstTouchPos;
@Override
public boolean dispatchTouchEvent(MotionEvent event)
{
if(this.getChildCount() <= 0)
{
Log.i(getClass().getName(), "View is not moving: " + this.getId());
return super.dispatchTouchEvent(event);
}
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
firstTouchPos = event.getRawY();
}
else if(event.getAction() == MotionEvent.ACTION_MOVE)
{
float dx = event.getRawX() - lastRawX;
float dy = event.getRawY() - lastRawY;
lastRawX = event.getRawX();
lastRawY = event.getRawY();
if (Math.abs(dx) > Math.abs(dy)) {
// Scrolling horizontally, so ignore
return super.dispatchTouchEvent(event);
}
float rawY = event.getRawY();
float dragDistance = (rawY - firstTouchPos) * DragableViewFragment.SENSITIVITY;
if(rawY > lastRawY) //Dragging up, set scale factor.
{
System.out.println("DRAGING DOWN: " + dragDistance);
}
else
{
System.out.println("DRAGING UP: " + dragDistance);
}
lastDragDistance = dragDistance;
if(dragDistance > IGNORED_CASE || isDragging)
{
if(!isDragging)
{
isDragging = true;
event.setAction(MotionEvent.ACTION_CANCEL);
super.dispatchTouchEvent(event);
}
if(dragDistance >= 0)
{
this.setTranslationY(dragDistance);
return true;
}
}
}
else if(event.getAction() == MotionEvent.ACTION_UP)
{
isDragging = false;
float calculatedPecentage = (max_height - (lastDragDistance));
if(calculatedPecentage <= down_WeightPercent)
{
if(fragmentManager != null)
{
this.animate().translationY(max_height).setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
resetView();
}
@Override
public void onAnimationCancel(Animator animation) {
resetView();
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
fragmentManager.popBackStack();
}
else
{
throw new NullPointerException("FragmentManager not set in dragable view.");
}
}
else
{
this.animate().translationY(0);
}
}
return super.dispatchTouchEvent(event);
}
private void resetView()
{
this.setTranslationY(0f);
}
}