android中碰撞屏幕边界反弹问题
其实碰撞问题只是涉及到一点小算法而已,但在实际应用,尤其游戏中有可能会遇到,下面给出一个小示例,代码如下:
MainActivity:
- package com.lovo;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.RelativeLayout;
- import android.app.Activity;
- public class MainActivity extends Activity {
- private Handler handler;
- public static final int MOVE_IMAGE = 1;
- // 移动方向和距离
- private int decX = 5;
- private int decY = 5;
- // 坐标
- private int moveX;
- private int moveY;
- private boolean isMove;// 是否正在移动
- private RelativeLayout relative;
- private ImageView imageView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- imageView = (ImageView) findViewById(R.id.activity_main_image);
- handler = new MyHandler(this);
- relative = (RelativeLayout) findViewById(R.id.activity_main_relativelayout);
- Button endBtn = (Button) findViewById(R.id.activity_main_btn_end);
- endBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- isMove = false;
- }
- });
- Button btn = (Button) findViewById(R.id.activity_main_btn_start);
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (!isMove) {
- isMove = true;
- } else {
- return;
- }
- new Thread() {
- public void run() {
- while (isMove) {
- moveX += decX;
- moveY += decY;
- if ((moveX + imageView.getWidth()) >= relative
- .getWidth() || moveX < 0) {
- decX = -decX;
- }
- if ((moveY + imageView.getHeight()) >= relative
- .getHeight() || moveY < 0) {
- decY = -decY;
- }
- Message message = new Message();
- message.what = MOVE_IMAGE;
- Bundle bundle = new Bundle();
- bundle.putInt("moveX", moveX);
- bundle.putInt("moveY", moveY);
- message.setData(bundle);
- handler.sendMessage(message);
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- };
- }.start();
- }
- });
- }
- }
MyHandler类:
- package com.lovo;
- import android.app.Activity;
- import android.os.Handler;
- import android.os.Message;
- import android.widget.ImageView;
- import android.widget.RelativeLayout;
- public class MyHandler extends Handler {
- private Activity activity;
- private ImageView imageView;
- public MyHandler(Activity activity) {
- this.activity = activity;
- }
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- imageView = (ImageView) activity.findViewById(R.id.activity_main_image);
- if (msg.what == MainActivity.MOVE_IMAGE) {
- android.widget.RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
- RelativeLayout.LayoutParams.WRAP_CONTENT,
- RelativeLayout.LayoutParams.WRAP_CONTENT);
- // 利用Margin改变小球的位置
- lp.setMargins(msg.getData().getInt("moveX"),
- msg.getData().getInt("moveY"), 0, 0);
- imageView.setLayoutParams(lp);
- }
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/activity_main_relativelayout"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true" >
- <Button
- android:id="@+id/activity_main_btn_start"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="开始" />
- <Button
- android:id="@+id/activity_main_btn_end"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="停止" />
- </LinearLayout>
- <ImageView
- android:id="@+id/activity_main_image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ball" />
- </RelativeLayout>
附上图片效果:
android中碰撞屏幕边界反弹问题的更多相关文章
- android中的屏幕单位介绍
1.px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px 会比较多.通常不推荐使用这个. 2.dip 或dp(与密度无关的像素):一个基于density(密度)的 ...
- 详解Android中的屏幕方向
屏幕方向 是对Activity而言的,所以你可以在AndroidManifest.xml 文件中,通过<activity> 标记的screenOrientation 属性进行设定,例如: ...
- android中获取屏幕的信息
获取屏幕信息比较简单,可以通过android的sdk自带的工具类DisplayMetrics.话不多说,上代码: // 获取屏幕的信息 DisplayMetrics dm = new DisplayM ...
- Android中获取屏幕长宽的方法
package com.kale.screen; import android.annotation.SuppressLint; import android.app.Activity; import ...
- [Selenium] Android 中旋转屏幕,触摸,滚动
package com.learingselenium.android; import junit.framework.TestCase import org.openqa.selenium.Rota ...
- Android中直播视频技术探究之---桌面屏幕视频数据源采集功能分析
一.前言 之前介绍了Android直播视频中一种视频源数据采集:摄像头Camera视频数据采集分析 中介绍了利用Camera的回调机制,获取摄像头的每一帧数据,然后进行二次处理进行推流.现在我们在介绍 ...
- 【转】如何在 Android 程序中禁止屏幕旋转和重启Activity
原文网址:http://www.cnblogs.com/bluestorm/p/3665890.html 禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变 ...
- 如何在 Android 程序中禁止屏幕旋转和重启Activity
禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android ...
- android多分辨率多屏幕密度下UI适配方案
相关概念 分辨率:整个屏幕的像素数目,为了表示方便一般用屏幕的像素宽度(水平像素数目)乘以像素高度表示,形如1280x720,反之分辨率为1280x720的屏幕,像素宽度不一定为1280 屏幕密度:表 ...
随机推荐
- bat脚本禁用和开启本地连接
netsh interface set interface name="本地连接" admin=disabled //禁用本地连接 netsh interface set inte ...
- 使用hadoop eclipse plugin提交Job并添加多个第三方jar
来自:http://heipark.iteye.com/blog/1171923 通过 "conf.set("tmpjars", jars);" 可以设置第三方 ...
- 一张图弄明确开源协议-GPL、BSD、MIT、Mozilla、Apache和LGPL 之间的差别
导读 在开源软件中常常看到各种协议说明.GPL.BSD.MIT.Mozilla.Apache和LGPL. - 这些协议之间的有什么差别 - 怎样选择合适的开源协议 请看下文,特作记录一篇,以供兴许查看 ...
- git reset与git revert比較
git reset git reset的作用是还原Index的状态或改动本地分支HEAD的位置. 这个命令适合用于从某个提交点又一次开新的分支.比方,假设某个提交之后的代码我们都不要了,就能够在本地r ...
- OpenCV学习代码记录——轮廓(contour)检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tr ...
- Windows操作系统安全加固
本文档旨在指导系统管理人员或安全检查人员进行Windows操作系统的安全合规性检查和配置. 1. 账户管理和认证授权 1.1 账户 默认账户安全 禁用Guest账户. 禁用或删除其他无用账户(建议先禁 ...
- Linux 安全密钥验证
[root@rhel7 ~]# ssh-keygen --在客户端主机中生成“密钥对” Generating public/private rsa key pair. Enter file in wh ...
- 首次启动Kafka报Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
首次启动Kafka报错如下: 原因:内存不足,查看启动配置 调小一些:
- [转载]virtualbox安装64bit客户机
原文地址:virtualbox安装64bit客户机作者:kunth 1.虚拟64bit客户机 (1)安装virualbox (2)bios设置 supports virtualization为able ...
- Linux安装配置maven以及搭建nexus私服(编写启动脚本)
2011年07月12日16:32 下面介绍在Linux操作系统下安装配置maven和搭建nexus私服. 一.安装前的准备 下载 jdk http://www.oracle.com/technetw ...