首页 > 解决方案 > 通过触摸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>

标签: javaandroid

解决方案


您计算旋转的角度是相对于整个图像的。您需要保存最初触摸图像的角度,并相对于该原始角度旋转它。

虽然你这样做的整个方式都是错误的。您使用的是 0 毫秒动画?您应该只在视图上设置一个旋转矩阵。


推荐阅读