一、设备旋转问题

1.问题

设备旋转后,已绘制的矩形框会消失。要解决这个问题,可使用以下View方法:

protected Parcelable onSaveInstanceState()

protected void onRestoreInstanceState(Parcelable state)

以上方法的工作方式不同于Activity和Fragment的onSaveInstanceState(Bundle)方 法。首先,View视图有ID时,才可以调用它们。其次,相较于Bundle参数,这些方法返回并处 理的是实现Parcelable接口的对象。推荐使用Bundle,这样就不用自己实现Parcelable接口了。 (Parcelable接口的实现很复杂,如有可能,应尽量避免。) 最后,还需要保存BoxDrawingView的View父视图的状态。在Bundle中保存super. onSaveInstanceState()方法结果,然后调用super.onRestoreInstanceState(Parcelable)方法 把结果发送给超类。

2.解决办法

首先,View要有ID

    android:id="@+id/box_draw_view"

其次使用onSaveInstanceState、onRestoreInstanceState两个方法

    //保存数据@Overrideprotected Parcelable onSaveInstanceState() {saveStateBundle = new Bundle();saveStateBundle.putParcelable("onSaveInstanceState",super.onSaveInstanceState());saveStateBundle.putSerializable("mBoxen",(Serializable)mBoxen);return saveStateBundle;}//恢复数据@Overrideprotected void onRestoreInstanceState(Parcelable state) {Bundle bundle = (Bundle)state;Parcelable restoreState = bundle.getParcelable("onSaveInstanceState");super.onRestoreInstanceState(restoreState);mBoxen = (List<Box>)bundle.getSerializable("mBoxen");}

二、旋转矩形框

1.问题

请实现以两根手指旋转矩形框。这个练习有点难,想完成它,需在MotionEvent实现代码中 处理多个触控点(pointer)。当然,还要旋转canvas。 要处理多点触摸,先清楚以下概念。

 pointer index:获知当前一组触控点中,动作事件对应的触控点。

 pointer ID:给予手势中特定手指一个唯一的ID。

pointer index可能会变,但pointer ID绝对不会变。

请查阅开发者文档,学习以下MotionEvent方法的使用:

public final int getActionMasked()

public final int getActionIndex()

public final int getPointerId(int pointerIndex)

public final float getX(int pointerIndex)

public final float getY(int pointerIndex)

另外,还需查查ACTION_POINTER_UP和ACTION_POINTER_DOWN常量的用法。

2.解决办法

    @Overridepublic boolean onTouchEvent(MotionEvent event){PointF current=new PointF(event.getX(),event.getY());String action="";switch(event.getActionMasked()){case MotionEvent.ACTION_DOWN:action="ACTION_DOWN";mCurrentBox=new Box(current);mBoxen.add(mCurrentBox);//当第一个手指触摸到屏幕后,记录第一个触控点的IDpointer1=event.getPointerId(event.getActionIndex());break;case MotionEvent.ACTION_POINTER_DOWN:action="ACTION_POINTER_DOWN";//当第二个手指触摸到屏幕后,记录第二个触控点的IDpointer2=event.getPointerId(event.getActionIndex());//得到第一,第二个触控点的横,纵坐标fx = event.getX(event.findPointerIndex(pointer1));fy = event.getY(event.findPointerIndex(pointer1));sx = event.getX(event.findPointerIndex(pointer2));sy=event.getY(event.findPointerIndex(pointer2));mCurrentBox=null;break;case MotionEvent.ACTION_UP:action="ACTION_UP";pointer1=-1;mCurrentBox=null;break;case MotionEvent.ACTION_POINTER_UP:action="ACTION_POINTER_UP";pointer2=-1;break;case MotionEvent.ACTION_MOVE:action="ACTION_MOVE";if(pointer1!=removed && pointer2!=removed){//得到手指移动后第一,第二个触控点的横,纵坐标float nfx=event.getX(event.findPointerIndex(pointer1));float nfy=event.getY(event.findPointerIndex(pointer1));float nsx=event.getX(event.findPointerIndex(pointer2));float nsy=event.getY(event.findPointerIndex(pointer2));//计算移动前后的角度差值float mAngle = angleBetweenLines(fx, fy, sx, sy, nfx, nfy, nsx, nsy);}if(mCurrentBox!=null && pointer2==removed){mCurrentBox.setmCurrent(current);}invalidate();break;case MotionEvent.ACTION_CANCEL:action="ACTION_CANCEL";mCurrentBox=null;pointer1=-1;pointer2=-1;break;default:;}Log.d(TAG,"action "+action+" at x="+current.x+" y="+current.y);return true;}public float angleBetweenLines(float fx, float fy, float sx, float sy, float nfx, float nfy, float nsx, float nsy){float radian1=(float)Math.atan2(fy-sy,fx-sx);float radian2=(float)Math.atan2(nfy-nsy,nfx-nsx);float angle=(float)(Math.toDegrees(radian2-radian1)%360);if(angle<0){angle+=360;}return angle;}

Android编程权威指南第三版 第31章相关推荐

  1. Android编程权威指南.第3版.pdf

    Android编程权威指南.第3版.pdf 分享给大家. 下载链接 转载于:https://blog.51cto.com/4456998/2360887

  2. android编程权威指南(第2版)的PhotoGallery项目的练习

    最近在看<<android编程权威指南(第2版)>>这本书,里面有一个叫PhotoGallery的项目,需要用到Flickr的储存图片功能, 但是Flickr不能访问,所以我修 ...

  3. Android编程权威指南第3版 9.5 挑战练习:日期格式化

    转载请注明出处 目录 前言 1. 添加资源 2. Crime.java 3. CrimeActivity.java 4. CrimeFragment.java 5. CrimeLab.java 6. ...

  4. Android编程权威指南第3版 源代码

    需要原码请自行扫码下载

  5. 《CSS权威指南第三版》第二章的读书笔记

    第2章 选择器 CSS的主要优点,就是很容易向所有同类型的元素应用一组样式. 1.    基本规则 修改所有h2: h2{color:gray;} a.    规则结构 每个规则有两个基本部分:选择器 ...

  6. android编程权威指南 的PhotoGallery项目Flickr 不能访问的替代解决方法

    android编程权威指南 的PhotoGallery项目Flickr 不能访问的替代解决方法 参考: <<android编程权威指南(第2版)>>的PhotoGallery项 ...

  7. 挑战练习:禁止一题多答(三)(基于Android编程权威指南)

    本文同样是基于Android编程权威指南一书中的程序进行修改,而禁止一题多答的具体内容是:用户答完某道题,就禁掉那道题对应的按钮,防止用户一题多答. 我的思路是:先把公共的代码写进Question.j ...

  8. 《Android编程权威指南》-读书笔记(七) -处理旋转设备

    <Android编程权威指南>-读书笔记(七) -处理旋转设备 旋转设备会改变设备配置(device configuration).设备配置是用来描述设备当前状态的一系列特征.这些特征包括 ...

  9. 《Android编程权威指南》PhotoGallery应用梳理

    PhotoGalley是<Android编程权威指南>书中另外一个重要的应用.        github:https://github.com/xurui1995/PhotoGaller ...

  10. android程序设计activity,《Android编程权威指南》之第二个activity

    继续继续!<Android编程权威指南>第五章,Demo比较简单,总结重点吧. 本章节知识点的Demo很有意思,就是添加个acitivity,方便用户偷看当前问题的答案. 创建第二个act ...

最新文章

  1. SpringCloud Alibaba 微服务架构版本说明
  2. 高分辨率、实时的手持物体360°三维模型重建结构光技术
  3. php返回图片给安卓_android上传图片到PHP的过程详解
  4. Angular gitlab持续集成之runner配置
  5. 提取网页的table时,遇到table中的两行(tr)中间有空行(或无空行)的正则表达式我的处理
  6. DevExpress v15.1:ASP.NET MVC功能升级(一)
  7. Go 语言为什么能成功?
  8. DBCP,C3P0,druid,HiKariCP连接池配置使用
  9. 利用反射实现工厂模式
  10. 计分及竞赛软件启动时的错误现象及解决方法
  11. 【C/C++】LibVLC库在逐帧提取的开发中回调设置帧格式
  12. 中望cad自定义快捷键命令_cad中望_中望cad常用快捷键及命令
  13. 分享个10.2越狱手贱删除cydia最糟糕情况的恢复方法
  14. 单模光纤最大传输距离为多少_单模光纤传输距离是多少?
  15. A problem occurred starting process 'command 'xxx
  16. bzoj 4484: [Jsoi2015]最小表示
  17. 中国计算机设计大赛蔡思琦,建策杯2018年江苏省大学生计算机设计大赛.PDF
  18. MacOS 开发 — App多开
  19. BlockingQueue drainTo()
  20. 《Python程序设计》python常用的格式转换

热门文章

  1. Ubuntu 常用软件推荐(QQ、微信、MATLAB等)及安装过程
  2. python写 两只老虎.wav 音频文件
  3. 阿里视频云点播端体验Demo
  4. 中国国产十大著名户外运动品牌全球最顶级碳纤维自行车品牌排行榜
  5. git版本管理软件——git储藏
  6. 政府采购和招标投标常见问题:评标的依据是什么?
  7. linux下磁盘坏道修复,linux磁盘坏道修复记录
  8. uni-app - 解决 H5 微信公众号授权登录后,无法回退到 “上一页“ 的问题(微信登录后如何返回到触发它的那一页?无法通过 uni.navigateBack() 返回到前一页的问题?)详细教程
  9. 《具体数学》部分习题解答1
  10. mysql routines是什么_MySQL入门:Stored Routines 的变数与流程 - Break易站