onFling()与onScroll()的具体区别

      在手势检测中,onFling()onScroll()有点类似,一个为“滑动”,一个为“滚动”。都是手指在屏幕(或某一组件)上移动一段距离后触发。

     然而二者毕竟是有区别的:(下面结论是在我自己的demo中亲自操作得出的结果,有不对的请指出错误)


一、在滑动距离上,二者没有(明显)区别:

               在检测效果的操作中,滑动距离无论长短都会触发。


二、在滑动速率触发顺序上有区别: 

               onFling()为“滑动”的最后触发(即手指Up抬起时触发),需要较为快速的"滑动"操作(但在"滑动"过程中,也会不停的触发onScroll()),如果慢速滑动,通过日志可以看出,最后没有调用onFling()。

                

               onScroll()为“拖动”或“滑动”的过程中不断触发,直到动作结束,无论快慢都会触发。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很遗憾,我无法为您编写完整的代码。不过,我可以提供一些基本思路和代码片段来帮助您开始编写 Android 上的贪吃蛇游戏。 首先,您需要创建一个布局文件来显示游戏画面。以下是一个示例: ```xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/background_color"> <TextView android:id="@+id/scoreTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/score_text" android:textColor="@color/text_color" android:textSize="20sp" /> <TextView android:id="@+id/gameOverTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/game_over_text" android:textColor="@color/text_color" android:textSize="30sp" android:visibility="gone" /> <RelativeLayout android:id="@+id/gameBoardRelativeLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/scoreTextView" android:layout_centerInParent="true" /> </RelativeLayout> ``` 这个布局文件中包含一个用于显示当前得分的 TextView 和一个用于显示游戏结束信息的 TextView。还有一个 RelativeLayout,用于显示游戏板。 接下来,您需要创建一个 SnakeView 类,继承自 View 类。这个类将负责绘制蛇和食物,并触发游戏逻辑。 ```java public class SnakeView extends View implements GestureDetector.OnGestureListener { private static final int BLOCK_SIZE = 50; private Snake snake; private Food food; private int score = 0; private Paint snakePaint, foodPaint; private GestureDetector gestureDetector; public SnakeView(Context context) { super(context); init(); } public SnakeView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public SnakeView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { snakePaint = new Paint(); snakePaint.setColor(Color.GREEN); foodPaint = new Paint(); foodPaint.setColor(Color.RED); gestureDetector = new GestureDetector(getContext(), this); snake = new Snake(); food = new Food(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (Block block : snake.getBody()) { canvas.drawRect(block.getX() * BLOCK_SIZE, block.getY() * BLOCK_SIZE, block.getX() * BLOCK_SIZE + BLOCK_SIZE, block.getY() * BLOCK_SIZE + BLOCK_SIZE, snakePaint); } canvas.drawRect(food.getX() * BLOCK_SIZE, food.getY() * BLOCK_SIZE, food.getX() * BLOCK_SIZE + BLOCK_SIZE, food.getY() * BLOCK_SIZE + BLOCK_SIZE, foodPaint); } @Override public boolean onTouchEvent(MotionEvent event) { gestureDetector.onTouchEvent(event); return true; } @Override public boolean onDown(MotionEvent motionEvent) { return true; } @Override public void onShowPress(MotionEvent motionEvent) { } @Override public boolean onSingleTapUp(MotionEvent motionEvent) { return false; } @Override public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { return false; } @Override public void onLongPress(MotionEvent motionEvent) { } @Override public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { // 根据滑动方向来确定蛇的运动方向 return false; } } ``` 这个类中包含一个 Snake 实例和一个 Food 实例,还有一个计分器。snakePaint 和 foodPaint 用于绘制蛇和食物。gestureDetector 用于处理触摸事件,以控制蛇的移动方向。 Snake 和 Food 类的实现如下: ```java public class Snake { private List<Block> body; private Direction direction = Direction.RIGHT; public Snake() { body = new ArrayList<>(); for (int i = 0; i < 3; i++) { body.add(new Block(10 - i, 5)); // 初始化蛇的身体 } } public boolean move() { // 移动蛇的身体 return true; // 是否吃到食物 } public List<Block> getBody() { return body; } public void setDirection(Direction direction) { this.direction = direction; } public enum Direction { UP, RIGHT, DOWN, LEFT } } public class Food { private int x, y; public Food() { x = randomNumber(); y = randomNumber(); } public int getX() { return x; } public int getY() { return y; } private int randomNumber() { Random random = new Random(); return random.nextInt(20); } } ``` Snake 类中的 move() 方法负责控制蛇的移动逻辑,同时还会返回一个布尔值,表示蛇是否吃到了食物。 最后,您需要在 Activity 中初始化 SnakeView,并将其添加到布局中: ```java public class MainActivity extends AppCompatActivity { private SnakeView snakeView; private TextView scoreTextView, gameOverTextView; private int score = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); snakeView = new SnakeView(this); RelativeLayout gameBoardRelativeLayout = findViewById(R.id.gameBoardRelativeLayout); gameBoardRelativeLayout.addView(snakeView); scoreTextView = findViewById(R.id.scoreTextView); gameOverTextView = findViewById(R.id.gameOverTextView); snakeView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { snakeView.getViewTreeObserver().removeOnGlobalLayoutListener(this); startGame(); } }); } private void startGame() { // 启动游戏循环 } private void gameOver() { // 显示游戏结束信息 } private void updateScore() { // 更新得分显示 } } ``` 在 startGame() 方法中,您需要启动一个循环,在每个循环周期中调用 SnakeView 的 invalidate() 方法重绘游戏画面,同时更新计分器和检查游戏是否结束。在循环中,您需要调用 Snake 类的 move() 方法控制蛇的移动。如果蛇吃到了食物,需要更新得分和重新生成食物。 这些都是 Snake 游戏开发的基本思路,具体实现细节可能会有所不同,需要您根据自己的需求进行调整和修改。祝您开发愉快!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值