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

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. Linux shell中一些参数与变量简介

    linux中shell变量$#,$@,$0,$1,$2,$!,$$,$*,$-,$@......等很多个,很容易记错,这里再次整理一下,相关含义解释如下,并附上一个实践截图. 多看几次,多用几次,应该 ...

  2. Server Performance Advisor (SPA) 3.0

    http://blogs.technet.com/b/windows-server-china-blog/archive/2013/03/26/server-performance-advisor-s ...

  3. SQL Server配置支持中文

  4. python乱码问题之爬虫篇

    UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 167: illegal multibyte sequence 使 ...

  5. Aerospike系列:3:aerospike特点分析

    1. 数据存放 数据可以放内存,也可以放SSD.   数据放内存时速度肯定会很快,但这和memcache一样,相比memcache性能并没有优势 数据放内存时可以进行持久化配置,但文档只有一个地方提了 ...

  6. 演示一下:rm -rf /

  7. SSM实战——秒杀系统前言

    项目来源:慕课网http://www.imooc.com/u/2145618/courses?sort=publish 项目开发流程:整合SSM框架——项目需求分析与实现——解决高并发优化 所用技术: ...

  8. Mysql查询优化之 触发器加中间表 方法优化count()统计大数据量总数问题

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6138288.html 在上一篇博文我们提到,分页有三种方法.其中,第三种是我们最常用的.然而,在实际应用过程中 ...

  9. springMVC加载远程freemarker模板文件

    在一个大网站里,有很多子域名,也就是有很多子系统,这些子系统由不同的团队负责,对整个网站的风格的风格至少得要是一致的(最基本的页头.页尾必须一致),这个时候得提供一份统一的页头.页尾以及公共的JS.c ...

  10. 如何快速的得到string的最后一个字符

    str='python' print str[-1]