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="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/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 控件跟随手指移动,类似捕鱼达人效果相关推荐

  1. Android控件随手指的移动而移动

    Android控件随手指的移动而移动 原理:这个不是很难,首先我们要给控件设置触摸监听时间,监听按下,移动,抬起等操作,然后在移动,按下里面分别获取按下的坐标,通过移动获取的坐标减去之前按下的坐标得到 ...

  2. android 控件随手指移动_液体流动控件,隔壁产品都馋哭了

    作者:彭也 链接: https://www.jianshu.com/p/4f0844c72e8a 模拟液体流动的展开特效,适合一些需要侧边展开进行辅助说明的页面,如用户在填写某个表单,需要操作很多步骤 ...

  3. android 控件随手指移动_Android 实习生面试经历记录

    code小生,一个专注 Android 领域的技术平台 公众号回复 Android 加入我的安卓技术群 作者:念人远乡 链接:https://www.jianshu.com/p/3cd5ef51eed ...

  4. android控件跟随手势滑动改变位置

    要求: 1.通过手指移动来拖动图片   2.控制图片不能超出屏幕显示区域 技术点: 1.MotionEvent处理 2.对View进行动态定位(layout) activity_main.xml: & ...

  5. Android 控件 RecyclerView 看这篇就够了

    [Android 控件 RecyclerView] 概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传 ...

  6. Android 控件 RecyclerView

    [Android 控件 RecyclerView] 概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传 ...

  7. android控件属性

    android控件属性 控件属性: android属性 Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了网上不少资料, 第一类:属性值为true或false an ...

  8. 【Android】关于Android控件EditText的属性InputType的一些经验

    关于Android控件EditText的属性InputType的一些经验   来源:http://blog.163.com/inflexible_simple/blog/static/16769468 ...

  9. android控件的touch事件_聊聊Android嵌套滑动

    聊聊Android嵌套滑动 最近工作中遇到了需求是使用 Bottom-Sheet 交互的弹窗,使用了 design 包里面的 CoordinatorLayout 和 BottomSheetBehavi ...

最新文章

  1. linux gcc编译c文件头文件,使用GCC编译器编译C语言
  2. 基本数据类型_JavaScript基本数据类型
  3. tomcat 拦截指定url_一口气说出 过滤器 和 拦截器 6个区别,别再傻傻分不清了
  4. python在数字后添加字符_Python在字符前后补字符
  5. Master公式求递归复杂度
  6. MySQL基础知识系统学习
  7. unity检测范围内敌人_Unity判断周围是否有敌人
  8. 不使用setPositiveButton 如何让alertdialog消失
  9. 2016年11月份各省市报考时间与报名链接 软考 系统集成项目管理工程师
  10. ffmpeg批量将图片合并为视频
  11. 计算机的6种典型应用领域,人工智能已经广泛应用到许多领域,其典型的应用包括这些...
  12. 第一天:django+vue项目立项
  13. 2017国培计算机研修计划,2017年国培计划个人研修计划
  14. ACAC java中final关键字
  15. 还在买鲜花送女神?手把手教你搭建3D立体相册网站,包女神稀饭
  16. 微信公众号开发--获取用户信息中文乱码的解决方案
  17. qsv的像素格式转换
  18. linux nmea解析程序,GPS的NMEA数据解析
  19. 给定三条边,请你判断一下能不能组成一个三角形。
  20. MacBook命令行开启mysql

热门文章

  1. 初学编程者之建议(-)
  2. iMeta | 国际标准刊号ISSN在线版正式确认
  3. 浅谈struts2之chain
  4. for in,forEach,for of
  5. Open3d学习计划——6(RGBD图像)
  6. Halcon3D学习笔记
  7. a标签不跳转的几种实现方式
  8. 实现Spring Boot 定时发送带附件邮件功能
  9. 在直播平台搭建平台中,购物源码开发公司的直播间搭建该如何选择流媒体直播系统传输协议
  10. 远征手游找不到以前的服务器,《剑与远征》找不到服务器怎么解决 找不到服务器账号解决方法分享...