通过2048学习自定义view(二) 滑动事件监听 与 事件回调
2018-02-01 15:33
453 查看
简介
续上一篇文章(通过2048学习自定义view(一))的进度,本期加上了用户上下左右滑动的事件与总分改变时的回调(下文有回调思想的讲解,干货),其实都很简单。。时间主要花在算法设计上,但算法不是本篇文章的重点所以不给出代码(`・ω・´)。所以现在的进度是基本可玩但没有动画。(下期实现动画)效果图
不要说丑。。我也知道,但这不是重点,还有数字大小只适合一位数。。但实在懒得改了  ̄へ ̄顺便给出xml代码:
<TextView android:id="@+id/grade" android:textSize="30sp" android:layout_width="match_parent" android:layout_height="wrap_content" /> <com.homework.animation.GameView android:id="@+id/game" android:layout_width="match_parent" android:layout_height="wrap_content" />
滑动事件监听:
其实2048的滑动事件还是很简单的,只有上下左右,所以连手势类都用不上,直接重写onTouchEvent。
通过
event.getAction()的
MotionEvent.ACTION_DOWN与
MotionEvent.ACTION_UP获取用户按下与抬起时的手指的位置,再通过正负啊绝对值的大小啊判断用户到底想往哪个方向滑。
Action类是我的算法类。。它维护着一个与2048主体一样的四乘四的数组,用户滑动后先更新Action类的数组,在把该数组赋给GameView中的数组,然后GameView通过自己的数组重新
draw()出滑动后的2048。
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); break; ca 4000 se MotionEvent.ACTION_UP: endX = event.getX(); endY = event.getY(); if (endX - startX > 0 && Math.abs(endX - startX) > Math.abs(endY - startY)) { action.right(); } else if (endX - startX <= 0 && Math.abs(endX - startX) > Math.abs(endY - startY)) { action.left(); } else if (endY - startY > 0 && Math.abs(endX - startX) <= Math.abs(endY - startY)) { action.down(); } else if (endY - startY < 0 && Math.abs(endX - startX) <= Math.abs(endY - startY)) { action.up(); } numOfGrid = action.getNum();//得到新的数组 setTotalGrade();//更新总分 invalidate();//刷新界面 break; } return true; }
总分的接口回调:
如xml文件所见,我是想直接在GameView上加一个TextView来显示总分的。。但是总分是会变的。。但TextView怎么知道什么时候会变啊。所以只好弄一个回调接口咯,顺便温习一下。其实接口回调我们经常使用,但用的都是别人编好的View,如:
textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } });
这种匿名内部类的写法即简单明了又方便,下面分析它是怎么实现的:(非源码)
背后的View类里会有一个名为
OnClickListener的接口,而且有该接口的属性:
protected OnClickListener onClickListener; interface OnClickListener { public void OnClick(); }
然后有一个公共的方法:
public void setOnClickListener(View.OnClickListener onClickListener){ this.onClickListener = onClickListener; }
这样就把我们在activity里写的onClickListener(onClick方法)传给了View,然后View再在事件发生的地方调用
onClickListener.onClick();即可触发我们规定的事件了。
好了,按照这个思路我们要先我们的Listener了:
//GameView内: public int totalGrade;//总分 private OnNumChangeListener onNumChangeListener; interface OnNumChangeListener { void OnChange(); } //当重新计算总分时,触发事件,调用onNumChangeListener.OnChange() private void setTotalGrade() { totalGrade = 0 ;//清零 for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { totalGrade += numOfGrid[i][j]; } } //回调 if(onNumChangeListener != null){ onNumChangeListener.OnChange(); } }
接着在Activity内帅气地使用匿名内部类:(~ ̄▽ ̄)~
gameView.setOnNumChangeListener(new GameView.OnNumChangeListener() { @Override public void OnChange() { if (textView != null && gameView != null) textView.setText("总分: " + gameView.totalGrade); } });
完事。。
相关文章推荐
- 通过ImageView的点击监听事件来滑动ScrollView的滚动条,进而改变屏幕显示内容
- 自定义webView,实现带title和返回的webView,监听webView的滑动事件
- 通过2048学习自定义view(一)
- Android_自定义View-和view的监听事件
- 自定义表格控件(通过TabLayout+TabRow)获取表格所有数据,并对表格进行相关事件监听
- Android 自定义ScrollView的滑动监听事件
- iOS:使用Block回调按钮事件(自定义view)
- ios学习笔记----实现一个带滑动手势的tabBarViewController,并可自定义tabBar
- android学习之——Android事件处理(监听和回调)
- Android之自定义View的监听事件
- 自定义View监听onKeyDown事件,View捕获焦点
- Android自定义View—事件分发机制与滑动冲突处理(三)
- 关于实现自定义Dialog和实现Dialog里view的事件监听的两种方法
- RecyclerView实现滑动和删除事件的监听方法
- JS学习第二篇;自定义事件并监听
- 自定义view实现开关按钮并监听(有滑动效果)
- Android中使用回调接口实现自定义view的点击事件
- 2014-10-27Android学习------自定义widget的监听事件的实现-----城市列表应用程序
- 学习过程中遇到很好的博客去学习-Handler详解(超棒)-View事件分发机制(解决ViewPager的滑动冲突)
- 自定义view的点击、长按、及长按手势监听事件