java - 通过触摸android旋转视图
问题描述
通过触摸旋转视图 android Rotate layout on touch 但是当我按下第一个并用手指旋转时会发生奇怪的事情。它可以正常工作,但是当我按下其他位置时,例如 number2 或 number3 或 number4 或任何其他圆圈 number1 圆圈出现在我的手指下方,为什么!
我想捕捉任何圆圈并以另一种方式旋转它的形状,我想从我触摸的地方旋转形状,而不仅仅是形成
第一,我尝试了很多代码,但找不到解决方案
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.RotateAnimation;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.github.andreilisun.circular_layout.CircularLayout;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements OnTouchListener{
private RelativeLayout wheel;
private CircularLayout circle;
TextView number1TextView,number2TextView;
private double mCurrAngle = 0 ,mPrevAngle = 0;
ArrayList<View>views;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wheel = findViewById(R.id.rl_main_layout);
circle = findViewById(R.id.cl_main_layout);
number1TextView = findViewById(R.id.tv_main_number1);
number2TextView = findViewById(R.id.tv_main_number2);
views = new ArrayList<>();
for(int i=0; i<circle.getChildCount(); i++){
views.add(circle.getChildAt(i));
}
wheel.setOnTouchListener(this);
}
@Override
public boolean onTouch(final View v, MotionEvent event) {
final float xc = wheel.getWidth() / 2;
final float yc = wheel.getHeight() / 2;
final float x = event.getX();
final float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: {
System.out.println("MOVe "+mCurrAngle);
mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y));
mPrevAngle = mCurrAngle;
animate(mPrevAngle, mCurrAngle, 0);
for(int i=0; i<views.size(); i++) {
// if(views.get(i) instanceof TextView)
//animate2(-mCurrAngle, -mPrevAngle, 0, views.get(i));
}
break;
}
}
return true;
}
private void animate(double fromDegrees, double toDegrees, long durationMillis ) {
final RotateAnimation rotate = new RotateAnimation((float) fromDegrees, (float) toDegrees,
RotateAnimation.RELATIVE_TO_PARENT, 0.5f,
RotateAnimation.RELATIVE_TO_PARENT, 0.5f);
rotate.setDuration(durationMillis);
rotate.setFillEnabled(true);
rotate.setFillAfter(true);
wheel.startAnimation(rotate);
}
}
XML 代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
android:gravity="center">
<RelativeLayout
android:id="@+id/rl_main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<ImageView
android:layout_width="@dimen/dp200w"
android:layout_height="@dimen/dp200w"
android:layout_centerInParent="true"
android:src="@drawable/background" />
<com.github.andreilisun.circular_layout.CircularLayout
android:id="@+id/cl_main_layout"
android:layout_width="@dimen/dp270w"
android:layout_height="@dimen/dp270w"
android:layout_centerInParent="true"
android:gravity="center">
<RelativeLayout
android:layout_width="@dimen/dp60w"
android:layout_height="@dimen/dp70w"
android:paddingTop="@dimen/dp10h"
>
<TextView
android:id="@+id/tv_main_number1"
android:layout_width="@dimen/dp60w"
android:layout_height="@dimen/dp60w"
android:background="@drawable/circle_background"
android:padding="@dimen/dp2w"
android:gravity="center"
android:text="Number1"
android:textColor="#ffffff"
/>
</RelativeLayout>
<RelativeLayout
android:layout_width="@dimen/dp60w"
android:layout_height="@dimen/dp70w"
android:paddingTop="@dimen/dp10h"
>
<TextView
android:id="@+id/tv_main_number2"
android:layout_width="@dimen/dp60w"
android:layout_height="@dimen/dp60w"
android:background="@drawable/circle_background"
android:padding="@dimen/dp2w"
android:gravity="center"
android:text="Number2"
android:textColor="#ffffff"
/>
</RelativeLayout>
<TextView
android:id="@+id/textView"
android:layout_width="@dimen/dp60w"
android:layout_height="@dimen/dp60w"
android:background="@drawable/circle_background"
android:padding="@dimen/dp2w"
android:gravity="center"
android:text="Number3"
android:textColor="#ffffff"
/>
<TextView
android:layout_width="@dimen/dp60w"
android:layout_height="@dimen/dp60w"
android:background="@drawable/circle_background"
android:padding="@dimen/dp2w"
android:gravity="center"
android:text="Number4"
android:textColor="#ffffff"
/>
<TextView
android:id="@+id/tv_main_tefa"
android:layout_width="@dimen/dp60w"
android:layout_height="@dimen/dp60w"
android:background="@drawable/circle_background"
android:padding="@dimen/dp2w"
android:gravity="center"
android:text="TEfa"
android:textColor="#ffffff"
/>
<TextView
android:layout_width="@dimen/dp60w"
android:layout_height="@dimen/dp60w"
android:background="@drawable/circle_background"
android:padding="@dimen/dp2w"
android:gravity="center"
android:text="Number6"
android:textColor="#ffffff"
/>
<TextView
android:layout_width="@dimen/dp60w"
android:layout_height="@dimen/dp60w"
android:background="@drawable/circle_background"
android:padding="@dimen/dp2w"
android:gravity="center"
android:text="Number7"
android:textColor="#ffffff"
/>
<TextView
android:layout_width="@dimen/dp60w"
android:layout_height="@dimen/dp60w"
android:padding="@dimen/dp2w"
android:background="@drawable/circle_background"
android:gravity="center"
android:text="Number8"
android:textColor="#ffffff"
/>
</com.github.andreilisun.circular_layout.CircularLayout>
</RelativeLayout>
解决方案
您计算旋转的角度是相对于整个图像的。您需要保存最初触摸图像的角度,并相对于该原始角度旋转它。
虽然你这样做的整个方式都是错误的。您使用的是 0 毫秒动画?您应该只在视图上设置一个旋转矩阵。
推荐阅读
- java - 响应不包含值时的 JSON 解析问题
- python - 如何在 Python 中显示 SVG 图像
- spring - 在一个 Spring 应用程序上下文中配置两个不同的作业存储库。这样做是否正确?
- typescript - 打字稿接口泛型:仅当 T 是联合类型 'A | 时才允许泛型 T 乙'
- gitlab - 如何使用标签设置作业工件以永不过期 Gitlab CI
- debugging - 是否有在调试应用程序之间切换的热键
- ios - 聊天分页面临的问题
- c++ - 为 C++ 头文件中的类属性声明而苦苦挣扎?
- amazon-web-services - 尝试创建 DynamoDb 表时出现 IAM 安全凭证错误
- reactjs - 何时使用 Redux 从 api 调用中获取数据