如何解决拖动达到垂直限制时文本出现故障
我正在尝试制作只能在屏幕上垂直显示的可拖动文本。但是,我为文本设置了一个限制,这样就不会超出屏幕范围。这是我所期望的:
但是在达到极限时会出现小故障。向下拖动时,它会在达到极限之前捕捉到其底限。然后有时它仍然停留在底部极限处,并在向下拖动时被擦除。缓慢向上拖动时,它越过了此剪辑所示的垂直上限:
代码:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:id="@+id/textContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/draggableText"
android:layout_width="350dp"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Draggable Text"
android:textSize="36sp" />
</LinearLayout>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java:
package com.android.draganddrop;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity {
private ViewGroup rootLayout;
private int yDelta;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rootLayout = findViewById(R.id.root);
LinearLayout textContainer = findViewById(R.id.textContainer);
textContainer.setOnTouchListener(new ChoiceTouchListener());
}
private final class ChoiceTouchListener implements View.OnTouchListener {
public boolean onTouch(View view,MotionEvent event) {
int Y = (int) event.getRawY();
// Log.d("yourtag","Y: " + Y); <== Use this line to track the text's coordinates in the Logcat
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
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) view
.getLayoutParams();
layoutParams.topMargin = Y - yDelta;
layoutParams.bottomMargin = -250;
view.setLayoutParams(layoutParams);
if (Y < 75) { // This is where I set the top vertical limit
view.setY(75);
} else if (Y > 1150) { // This is where I set the bottom vertical limit
view.setY(1150);
}
break;
}
rootLayout.invalidate();
return true;
}
}
}
错误:无
感谢您的帮助!
解决方法
在具有ConstraintLayout的世界中,不需要RelativeLayout。
您可以达到预期的效果using MotionLayout。
布局XML:
<!-- Copyright (C) 2018 The Android Open Source Project Licensed under the Apache License,Version 2.0 -->
<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/motionLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/scene_02">
<TextView
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="64dp"
android:layout_margin="64dp"
android:textSize="36sp"
android:text="Draggable Text"
/>
</androidx.constraintlayout.motion.widget.MotionLayout>
上面引用的 MotionScene(app:layoutDescription="@xml/scene_02"
):
<!-- Copyright (C) 2018 The Android Open Source Project Licensed under the Apache License,Version 2.0 -->
<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:motion="http://schemas.android.com/apk/res-auto">
<Transition
motion:constraintSetEnd="@+id/end"
motion:constraintSetStart="@+id/start"
motion:duration="1000">
<OnSwipe
motion:dragDirection="dragDown"
motion:touchAnchorId="@id/button"
motion:touchAnchorSide="top" />
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint android:id="@id/button">
<Layout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="64dp"
motion:layout_constraintEnd_toEndOf="parent"
motion:layout_constraintStart_toStartOf="parent"
motion:layout_constraintTop_toTopOf="parent" />
</Constraint>
</ConstraintSet>
<ConstraintSet
android:id="@+id/end"
motion:deriveConstraintsFrom="@id/start">
<Constraint android:id="@id/button">
<Layout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="64dp"
motion:layout_constraintBottom_toBottomOf="parent"
/>
</Constraint>
</ConstraintSet>
</MotionScene>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。