失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > android 控件跟随手指移动 类似捕鱼达人效果

android 控件跟随手指移动 类似捕鱼达人效果

时间:2022-09-18 22:39:50

相关推荐

android 控件跟随手指移动 类似捕鱼达人效果

public class TestActivity extends AppCompatActivity {private ImageView imageView;private ImageView imageView2;private Context context;//defalut旋转开始角度private float dfFromDegrees = -90;//旋转结束角度private float dfToDegrees = 90;private ObjectAnimator animator;//动画类型private String propertyName = "rotation";//持续时间private long duration = 3000;//重复模式int RepeatCount = -1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_test);context = TestActivity.this;initView();initAnimator();animatorStart();}//初始化动画private void initAnimator() {animator = ObjectAnimator.ofFloat(imageView, propertyName, dfFromDegrees, dfToDegrees);animator.setDuration(duration);animator.setRepeatCount(RepeatCount);animator.setRepeatMode(ValueAnimator.REVERSE);}private void initView() {imageView = (ImageView) findViewById(R.id.image);imageView2 = (ImageView) findViewById(R.id.image2);imageView2.setVisibility(View.GONE);}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {LogUtil.i("countAngle(ev):" + countAngle(ev));switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:LogUtil.i("ACTION_DOWN");animatorCancel();setImageView2TransLation(ev, true);imageView.setRotation(countAngle(ev));break;case MotionEvent.ACTION_MOVE:LogUtil.i("ACTION_MOVE");animatorCancel();imageView2.setVisibility(View.VISIBLE);setImageView2TransLation(ev, true);imageView.setRotation(countAngle(ev));break;case MotionEvent.ACTION_UP:LogUtil.i("ACTION_UP");imageView2.setVisibility(View.GONE);setAnimatorDegrees(dfFromDegrees, dfToDegrees);setImageView2TransLation(ev, false);animatorStart();break;}return super.dispatchTouchEvent(ev);}//计算点击角度private float countAngle(MotionEvent event) {//点击的坐标Xfloat clickX = event.getX();//点击的坐标Yfloat clickY = event.getY();//imageView控件X坐标float viewX = imageView.getX() + imageView.getPivotX();float viewY = imageView.getY() + imageView.getPivotY();return getRotationBetweenLines(viewX, viewY, clickX, clickY);}//设置控件2位置是否隐藏private void setImageView2TransLation(MotionEvent ev, boolean isShow) {imageView2.setTranslationX(ev.getX() - imageView2.getWidth() / 2);imageView2.setTranslationY(ev.getY() - imageView2.getHeight());imageView2.setVisibility(isShow ? View.VISIBLE : View.GONE);}//设置动画旋转角度private void setAnimatorDegrees(float fromDegrees, float toDegrees) {animator = ObjectAnimator.ofFloat(imageView, propertyName, fromDegrees, toDegrees);animator.setDuration(3000);animator.setRepeatCount(-1);animator.setRepeatMode(ValueAnimator.REVERSE);}//开始动画private void animatorStart() {if (animator != null)animator.start();}//关闭动画private void animatorCancel() {if (animator != null)animator.cancel();}//centerX、centerY为公共点,xInView、yInView为触摸点的坐标public int getRotationBetweenLines(float centerX, float centerY, float xInView, float yInView) {double rotation = 0;double k1 = (double) (centerY - centerY) / (centerX * 2 - centerX);double k2 = (double) (yInView - centerY) / (xInView - centerX);double tmpDegree = Math.atan((Math.abs(k1 - k2)) / (1 + k1 * k2)) / Math.PI * 180;if (xInView > centerX && yInView < centerY) { //第一象限rotation = 90 - tmpDegree;} else if (xInView > centerX && yInView > centerY) //第二象限{rotation = 90 + tmpDegree;} else if (xInView < centerX && yInView > centerY) { //第三象限rotation = 270 - tmpDegree;} else if (xInView < centerX && yInView < centerY) { //第四象限rotation = 270 + tmpDegree;} else if (xInView == centerX && yInView < centerY) {rotation = 0;} else if (xInView == centerX && yInView > centerY) {rotation = 180;}return (int) rotation;}}

<RelativeLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/layout"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/image"android:layout_width="150dp"android:layout_height="150dp"android:background="@mipmap/ic_launcher"android:layout_centerInParent="true"/><ImageViewandroid:id="@+id/image2"android:layout_width="150dp"android:layout_height="150dp"android:background="@mipmap/ic_launcher"/></RelativeLayout>

如果觉得《android 控件跟随手指移动 类似捕鱼达人效果》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。