国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Android自定義控件1--EventParser

wanglu1209 / 2112人閱讀

摘要:測(cè)試效果方向測(cè)試角度位移測(cè)試速度解析一使用初始化時(shí)初始化并為設(shè)置監(jiān)聽器在里為設(shè)置解析對(duì)象不止是,在中也可以用只有有初始化為設(shè)置監(jiān)聽器設(shè)置解析對(duì)象這樣所有的這些事件參數(shù)就是你的了。

零、前言

</>復(fù)制代碼

  1. 自定義View經(jīng)常和事件打交道,不過那個(gè)event對(duì)象用著感覺挺麻煩
    打算自己寫一個(gè)事件的解析類來輔助事件的分析,功能包括:

</>復(fù)制代碼

  1. 1.點(diǎn)擊監(jiān)聽:回調(diào)-->傳出落點(diǎn)(類型PointF)
  2. 2.抬起監(jiān)聽:回調(diào)-->手指抬起點(diǎn)(類型PointF)、移動(dòng)方向(類型Orientation,八個(gè))
  3. 3.移動(dòng)監(jiān)聽:回調(diào)-->速度(double) y位移(float) x位移(float) 角度(double)、移動(dòng)方向
  4. 4.是否移動(dòng)、是否按下的判斷--------源碼比較簡(jiǎn)單,我注釋也很清楚,都貼在文尾,自行cv。
測(cè)試效果:

</>復(fù)制代碼

  1. 1.方向測(cè)試

</>復(fù)制代碼

  1. 2.角度、位移測(cè)試

</>復(fù)制代碼

  1. 3.速度解析

一、使用:

</>復(fù)制代碼

  1. 1.view初始化時(shí)初始化EventParser并為EventParser設(shè)置監(jiān)聽器
    2.在onTouchEvent里為mEventParser設(shè)置解析對(duì)象(不止是view,在Activity中也可以用,只有有event)

</>復(fù)制代碼

  1. public class EventView extends View {
  2. private EventParser mEventParser;
  3. public EventView(Context context) {
  4. this(context, null);
  5. }
  6. public EventView(Context context, @Nullable AttributeSet attrs) {
  7. super(context, attrs);
  8. init();
  9. }
  10. private void init() {
  11. mEventParser = new EventParser();//初始化EventParser
  12. //為EventParser設(shè)置監(jiān)聽器
  13. mEventParser.setOnEventListener(new OnEventListener() {
  14. @Override
  15. public void down(PointF pointF) {
  16. }
  17. @Override
  18. public void up(PointF pointF, Orientation orientation) {
  19. }
  20. @Override
  21. public void move(double v, float dy, float dx, double dir, Orientation orientation) {
  22. }
  23. });
  24. }
  25. @Override
  26. public boolean onTouchEvent(MotionEvent event) {
  27. mEventParser.parseEvent(event);//設(shè)置解析對(duì)象
  28. return true;
  29. }
  30. }

</>復(fù)制代碼

  1. 這樣所有的這些事件參數(shù)就是你的了。
    當(dāng)然也提供了適配器,只想用一個(gè)回調(diào)方法的,不需要直接實(shí)現(xiàn)接口,你可以:

</>復(fù)制代碼

  1. mEventParser.setOnEventListener(new OnEventAdapter(){
  2. @Override
  3. public void move(double v, float dy, float dx, double dir, Orientation orientation) {
  4. }
  5. });
二、代碼實(shí)現(xiàn)
1.解析器主類:EventParser

</>復(fù)制代碼

  1. /**
  2. * 作者:張風(fēng)捷特烈
  3. * 時(shí)間:2018/11/6 0006:20:22
  4. * 郵箱:1981462002@qq.com
  5. * 說明:事件解析器
  6. */
  7. public class EventParser {
  8. private OnEventListener onEventListener;
  9. private Orientation mOrientation = Orientation.NO;
  10. private PointF mTagPos;//按下坐標(biāo)點(diǎn)
  11. //移動(dòng)時(shí)坐標(biāo)點(diǎn)---在此創(chuàng)建對(duì)象,避免在move中創(chuàng)建大量對(duì)象
  12. private PointF mMovingPos = new PointF(0, 0);
  13. private float detaY = 0;//下移總量
  14. private float detaX = 0;//右移總量
  15. private boolean isDown = false;//是否按下
  16. private boolean isMove = false;//是否移動(dòng)
  17. private PointF mDownPos;//記錄按下時(shí)點(diǎn)
  18. private long lastTimestamp = 0L;//最后一次的時(shí)間戳
  19. public void setOnEventListener(OnEventListener onEventListener) {
  20. this.onEventListener = onEventListener;
  21. }
  22. /**
  23. * 添加自己的事件解析
  24. *
  25. * @param event 事件
  26. */
  27. public void parseEvent(MotionEvent event) {
  28. switch (event.getAction()) {
  29. case MotionEvent.ACTION_DOWN:
  30. isDown = true;
  31. //按下---為p0賦值
  32. mTagPos = new PointF(event.getX(), event.getY());
  33. mDownPos = mTagPos;
  34. lastTimestamp = System.currentTimeMillis();
  35. if (onEventListener != null) {
  36. onEventListener.down(mTagPos);
  37. }
  38. break;
  39. case MotionEvent.ACTION_MOVE:
  40. //移動(dòng)的那刻的坐標(biāo)(移動(dòng)中,不斷更新)
  41. mMovingPos.x = event.getX();
  42. mMovingPos.y = event.getY();
  43. //處理速度
  44. detaX = mMovingPos.x - mDownPos.x;
  45. detaY = mMovingPos.y - mDownPos.y;
  46. //下移單量
  47. float dx = mMovingPos.x - mTagPos.x;
  48. //右移單量
  49. float dy = mMovingPos.y - mTagPos.y;
  50. double ds = Math.sqrt(dx * dx + dy * dy);//偏移位移單量
  51. double dir = deg((float) Math.acos(detaX / ds));//角度
  52. long curTimestamp = System.currentTimeMillis();
  53. long dt = curTimestamp - lastTimestamp;
  54. //由于速度是C*px/ms
  55. double v = ds / dt * 100;
  56. orientationHandler(dir);//處理方向
  57. if (onEventListener != null) {
  58. onEventListener.move(v, detaY, detaX, detaY < 0 ? dir : -dir, mOrientation);
  59. }
  60. if (Math.abs(detaY) > 50 / 3.0) {
  61. isMove = true;
  62. }
  63. mTagPos.x = mMovingPos.x;//更新位置
  64. mTagPos.y = mMovingPos.y;//更新位置----注意這里不能讓兩個(gè)對(duì)象相等
  65. lastTimestamp = curTimestamp;//更新時(shí)間
  66. break;
  67. case MotionEvent.ACTION_UP:
  68. if (onEventListener != null) {
  69. onEventListener.up(mTagPos, mOrientation);
  70. }
  71. reset();//重置工作
  72. break;
  73. }
  74. }
  75. /**
  76. * 重置工作
  77. */
  78. private void reset() {
  79. isDown = false;//重置按下狀態(tài)
  80. isMove = false;//重置移動(dòng)狀態(tài)
  81. mDownPos.x = 0;//重置:mDownPos
  82. mDownPos.y = 0;//重置:mDownPos
  83. mOrientation = Orientation.NO;//重置方向
  84. }
  85. /**
  86. * 處理方向
  87. *
  88. * @param dir 方向
  89. */
  90. private void orientationHandler(double dir) {
  91. if (detaY < 0 && dir > 70 && dir < 110) {
  92. mOrientation = Orientation.TOP;
  93. }
  94. if (detaY > 0 && dir > 70 && dir < 110) {
  95. mOrientation = Orientation.BOTTOM;
  96. }
  97. if (detaX > 0 && dir < 20) {
  98. mOrientation = Orientation.RIGHT;
  99. }
  100. if (detaX < 0 && dir > 160) {
  101. mOrientation = Orientation.LEFT;
  102. }
  103. if (detaY < 0 && dir <= 70 && dir >= 20) {
  104. mOrientation = Orientation.RIGHT_TOP;
  105. }
  106. if (detaY < 0 && dir >= 110 && dir <= 160) {
  107. mOrientation = Orientation.LEFT_TOP;
  108. }
  109. if (detaX > 0 && detaY > 0 && dir >= 20 && dir <= 70) {
  110. mOrientation = Orientation.RIGHT_BOTTOM;
  111. }
  112. if (detaX < 0 && detaY > 0 && dir >= 110 && dir <= 160) {
  113. mOrientation = Orientation.LEFT_BOTTOM;
  114. }
  115. }
  116. public boolean isDown() {
  117. return isDown;
  118. }
  119. public boolean isMove() {
  120. return isMove;
  121. }
  122. /**
  123. * 弧度制化為角度制
  124. *
  125. * @param rad 弧度
  126. * @return 角度
  127. */
  128. private float deg(float rad) {
  129. return (float) (rad * 180 / Math.PI);
  130. }
  131. }
2.方向枚舉:

</>復(fù)制代碼

  1. /**
  2. * 作者:張風(fēng)捷特烈
  3. * 時(shí)間:2018/11/15 0015:8:14
  4. * 郵箱:1981462002@qq.com
  5. * 說明:移動(dòng)方向枚舉
  6. */
  7. public enum Orientation {
  8. NO("無"),//無
  9. TOP("上"), //上
  10. BOTTOM("下"),//下
  11. LEFT("左"),//左
  12. RIGHT("右"),//右
  13. LEFT_TOP("左上"),// 左上
  14. RIGHT_TOP("右上"), // 右上
  15. LEFT_BOTTOM("左下"),//左下
  16. RIGHT_BOTTOM("右下")//右下
  17. private String or;
  18. Orientation(String or) {
  19. this.or = or;
  20. }
  21. public String value() {
  22. return or;
  23. }
  24. }
3.事件監(jiān)聽回調(diào)

</>復(fù)制代碼

  1. /**
  2. * 作者:張風(fēng)捷特烈
  3. * 時(shí)間:2018/11/15 0015:8:13
  4. * 郵箱:1981462002@qq.com
  5. * 說明:事件監(jiān)聽回調(diào)
  6. */
  7. public interface OnEventListener {
  8. /**
  9. * 點(diǎn)擊
  10. *
  11. * @param pointF 落點(diǎn)
  12. */
  13. void down(PointF pointF);
  14. /**
  15. * 抬起
  16. *
  17. * @param pointF 抬起點(diǎn)
  18. * @param orientation 方向
  19. */
  20. void up(PointF pointF, Orientation orientation);
  21. /**
  22. * 移動(dòng)
  23. *
  24. * @param v 速度
  25. * @param dy y 位移
  26. * @param dx x位移
  27. * @param dir 角度
  28. * @param orientation 方向
  29. */
  30. void move(double v, float dy, float dx, double dir, Orientation orientation);
  31. }
4.事件處理適配器

</>復(fù)制代碼

  1. /**
  2. * 作者:張風(fēng)捷特烈
  3. * 時(shí)間:2018/11/15 0015:8:18
  4. * 郵箱:1981462002@qq.com
  5. * 說明:事件處理適配器
  6. */
  7. public class OnEventAdapter implements OnEventListener {
  8. @Override
  9. public void down(PointF pointF) {
  10. }
  11. @Override
  12. public void up(PointF pointF, Orientation orientation) {
  13. }
  14. @Override
  15. public void move(double v, float dy, float dx, double dir, Orientation orientation) {
  16. }
  17. }
后記:捷文規(guī)范
1.本文成長記錄及勘誤表
項(xiàng)目源碼 日期 備注
V0.1--無 2018-11-15 Android自定義控件輔助利器之EventParser
2.聲明

</>復(fù)制代碼

  1. 1----本文由張風(fēng)捷特烈原創(chuàng),轉(zhuǎn)載請(qǐng)注明
    2----歡迎廣大編程愛好者共同交流,微信:zdl1994328
    3----個(gè)人能力有限,如有不正之處歡迎大家批評(píng)指證,必定虛心改正
    4----看到這里,我在此感謝你的喜歡與支持

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/74264.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<