其实碰撞问题只是涉及到一点小算法而已,但在实际应用,尤其游戏中有可能会遇到,下面给出一个小示例,代码如下:

MainActivity:

  1. package com.lovo;
  2. import android.os.Bundle;
  3. import android.os.Handler;
  4. import android.os.Message;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import android.widget.ImageView;
  9. import android.widget.RelativeLayout;
  10. import android.app.Activity;
  11. public class MainActivity extends Activity {
  12. private Handler handler;
  13. public static final int MOVE_IMAGE = 1;
  14. // 移动方向和距离
  15. private int decX = 5;
  16. private int decY = 5;
  17. // 坐标
  18. private int moveX;
  19. private int moveY;
  20. private boolean isMove;// 是否正在移动
  21. private RelativeLayout relative;
  22. private ImageView imageView;
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_main);
  27. imageView = (ImageView) findViewById(R.id.activity_main_image);
  28. handler = new MyHandler(this);
  29. relative = (RelativeLayout) findViewById(R.id.activity_main_relativelayout);
  30. Button endBtn = (Button) findViewById(R.id.activity_main_btn_end);
  31. endBtn.setOnClickListener(new OnClickListener() {
  32. @Override
  33. public void onClick(View v) {
  34. isMove = false;
  35. }
  36. });
  37. Button btn = (Button) findViewById(R.id.activity_main_btn_start);
  38. btn.setOnClickListener(new OnClickListener() {
  39. @Override
  40. public void onClick(View v) {
  41. if (!isMove) {
  42. isMove = true;
  43. } else {
  44. return;
  45. }
  46. new Thread() {
  47. public void run() {
  48. while (isMove) {
  49. moveX += decX;
  50. moveY += decY;
  51. if ((moveX + imageView.getWidth()) >= relative
  52. .getWidth() || moveX < 0) {
  53. decX = -decX;
  54. }
  55. if ((moveY + imageView.getHeight()) >= relative
  56. .getHeight() || moveY < 0) {
  57. decY = -decY;
  58. }
  59. Message message = new Message();
  60. message.what = MOVE_IMAGE;
  61. Bundle bundle = new Bundle();
  62. bundle.putInt("moveX", moveX);
  63. bundle.putInt("moveY", moveY);
  64. message.setData(bundle);
  65. handler.sendMessage(message);
  66. try {
  67. Thread.sleep(10);
  68. } catch (InterruptedException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. };
  73. }.start();
  74. }
  75. });
  76. }
  77. }

MyHandler类:

  1. package com.lovo;
  2. import android.app.Activity;
  3. import android.os.Handler;
  4. import android.os.Message;
  5. import android.widget.ImageView;
  6. import android.widget.RelativeLayout;
  7. public class MyHandler extends Handler {
  8. private Activity activity;
  9. private ImageView imageView;
  10. public MyHandler(Activity activity) {
  11. this.activity = activity;
  12. }
  13. @Override
  14. public void handleMessage(Message msg) {
  15. super.handleMessage(msg);
  16. imageView = (ImageView) activity.findViewById(R.id.activity_main_image);
  17. if (msg.what == MainActivity.MOVE_IMAGE) {
  18. android.widget.RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
  19. RelativeLayout.LayoutParams.WRAP_CONTENT,
  20. RelativeLayout.LayoutParams.WRAP_CONTENT);
  21. // 利用Margin改变小球的位置
  22. lp.setMargins(msg.getData().getInt("moveX"),
  23. msg.getData().getInt("moveY"), 0, 0);
  24. imageView.setLayoutParams(lp);
  25. }
  26. }
  27. }
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/activity_main_relativelayout"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent" >
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:layout_alignParentBottom="true" >
  10. <Button
  11. android:id="@+id/activity_main_btn_start"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:layout_weight="1"
  15. android:text="开始" />
  16. <Button
  17. android:id="@+id/activity_main_btn_end"
  18. android:layout_width="match_parent"
  19. android:layout_height="wrap_content"
  20. android:layout_weight="1"
  21. android:text="停止" />
  22. </LinearLayout>
  23. <ImageView
  24. android:id="@+id/activity_main_image"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:src="@drawable/ball" />
  28. </RelativeLayout>

附上图片效果:

android中碰撞屏幕边界反弹问题的更多相关文章

  1. android中的屏幕单位介绍

    1.px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px 会比较多.通常不推荐使用这个. 2.dip 或dp(与密度无关的像素):一个基于density(密度)的 ...

  2. 详解Android中的屏幕方向

    屏幕方向 是对Activity而言的,所以你可以在AndroidManifest.xml 文件中,通过<activity> 标记的screenOrientation 属性进行设定,例如: ...

  3. android中获取屏幕的信息

    获取屏幕信息比较简单,可以通过android的sdk自带的工具类DisplayMetrics.话不多说,上代码: // 获取屏幕的信息 DisplayMetrics dm = new DisplayM ...

  4. Android中获取屏幕长宽的方法

    package com.kale.screen; import android.annotation.SuppressLint; import android.app.Activity; import ...

  5. [Selenium] Android 中旋转屏幕,触摸,滚动

    package com.learingselenium.android; import junit.framework.TestCase import org.openqa.selenium.Rota ...

  6. Android中直播视频技术探究之---桌面屏幕视频数据源采集功能分析

    一.前言 之前介绍了Android直播视频中一种视频源数据采集:摄像头Camera视频数据采集分析 中介绍了利用Camera的回调机制,获取摄像头的每一帧数据,然后进行二次处理进行推流.现在我们在介绍 ...

  7. 【转】如何在 Android 程序中禁止屏幕旋转和重启Activity

    原文网址:http://www.cnblogs.com/bluestorm/p/3665890.html 禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变 ...

  8. 如何在 Android 程序中禁止屏幕旋转和重启Activity

    禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android ...

  9. android多分辨率多屏幕密度下UI适配方案

    相关概念 分辨率:整个屏幕的像素数目,为了表示方便一般用屏幕的像素宽度(水平像素数目)乘以像素高度表示,形如1280x720,反之分辨率为1280x720的屏幕,像素宽度不一定为1280 屏幕密度:表 ...

随机推荐

  1. C++ 第十课:标准c时间与日期函数

    asctime() 时间文本格式 clock() 返回自程序开始运行所经过的时间 ctime() 返回特定格式时间 difftime() 两时刻的间隔 gmtime() 返回指向当前格林威治时间的指针 ...

  2. Mysql prepare 语法

    最近一直使用语句,SELECT auction_id, auction_name,SUM(new_cart),SUM(new_collect),SUM(total_cart),SUM(total_co ...

  3. 有关/proc/uptime这个文件里两个参数所代表的意义

    有关/proc/uptime这个文件里两个参数所代表的意义: [root@app ~]#cat /proc/uptime 3387048.81 3310821.00 第一个参数是代表从系统启动到现在的 ...

  4. 12 个非常实用的 jQuery 代码片段

    jQuery是一个非常流行而且实用的JavaScript前端框架,本文并不是介绍jQuery的特效动画,而是分享一些平时积累的12个jQuery实用代码片段,希望对你有所帮助. 导航菜单背景切换效果 ...

  5. maven-war-plugin 插件 web.xml 缺失时忽略

    我们很多时候开发Spring MVC 项目时我们完全可以使用Java Bean 和 Annotation 的方式来配置 Spring MVC 的 DispatcherServlet,而不再采用传统的 ...

  6. spring & java 面试

    https://blog.csdn.net/u014079773/article/details/52453002 1.Spring中AOP的应用场景.Aop原理.好处? 答:AOP--Aspect ...

  7. java 读取clob

      java 读取clob CreationTime--2018年7月1日09点41分 Author:Marydon 1.说明 jdbc 数据类型为Clob,与java的String类型相对应. 2. ...

  8. python模块之importlib(py3中功能有明显加强)

    # -*- coding: utf-8 -*-#python 27#xiaodeng#python模块之importlib(py3中功能有明显加强)

  9. 在CLion项目中指定不同版本的链接库

    在项目中, 需要使用到libevent-2.1.x, 但是Ubuntu16.04自带的libevent版本为2.0.5, 需要另外编译安装新版的libevent, 安装过程很简单 -stable.ta ...

  10. Arduino和C51之串口通信

    技术:51单片机.Arduino.串口通信   概述 本文主要讲解串口通信技术的使用方法,并通过串口点灯实验介绍了51单片机和Arduino串口的使用,为初学者学习串口知识提供帮助 详细 代码下载:h ...