Android模拟小球自由落体2(重力感应并添加z轴)
来源:互联网 发布:济南知豆电动汽车租赁 编辑:程序博客网 时间:2024/06/05 05:38
这次改进了昨天那个例子,添加了重力感应,并添加了z轴。这样算3D了吧(笑)。小球往屏幕里面落时会不断变小。改进了下绘图线程的控制,surfaceCreated时绘图线程启动,surfaceDestroyed时 绘图线程停止。还有极小概率会出现程序崩溃,不知道是不是不同线程同时读取KCList造成的,你们可以给KCList加个同步锁试试,概率太小了不好测试。
下面是代码。
package com.example.sft;import java.util.ArrayList;import java.util.List;import java.util.Random;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.RadialGradient;import android.graphics.Shader;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;public class TestSurfaceView extends SurfaceView implements SurfaceHolder.Callback{ private Paint cp; private List<KCircle> KCList; private Random r; private SensorManager sm; private MyThread mt; public TestSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub getHolder().addCallback(this); cp=new Paint(); cp.setColor(Color.BLACK); KCList=new ArrayList<KCircle>(); r=new Random(); sm=(SensorManager)context.getSystemService(context.SENSOR_SERVICE); Sensor sensor=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sm.registerListener(new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub KCircle.ax=-event.values[0]/16; KCircle.ay=event.values[1]/16; KCircle.az=-event.values[2]/16; } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } }, sensor, SensorManager.SENSOR_DELAY_GAME); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } private int getRandomColor(){ return r.nextInt()%0xff000000; } @Override public void surfaceCreated(SurfaceHolder arg0) { // TODO Auto-generated method stub if(mt==null||!mt.isRunning()){ mt=new MyThread(); mt.start(); } } @Override public void surfaceDestroyed(SurfaceHolder arg0) { // TODO Auto-generated method stub mt.stopThread(); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub KCList.add(new KCircle(getRandomColor(),(int)event.getX(),(int)event.getY())); return true; } class MyThread extends Thread{ private boolean runningTag=true; @Override public void run() { // TODO Auto-generated method stub runningTag=true; while(runningTag){ Canvas c=getHolder().lockCanvas(); if(c!=null){ c.drawPaint(cp); for(int i=0;i<KCList.size();i++){ if(KCList.get(i).isShouldRemove()){ KCList.remove(i); }else KCList.get(i).drawAndMove(c); } getHolder().unlockCanvasAndPost(c); } try { sleep(15); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Log.i("kagami", "stop"); } public void stopThread(){ runningTag=false; } public boolean isRunning(){ return runningTag; } } }
package com.example.sft;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.RadialGradient;import android.graphics.Shader;import android.util.Log;public class KCircle { private int color; public int x; public int y; public int z; private Paint p; private int radius; float vx; float vy; float vz; static float ax=0; static float ay=0; static float az=0; public KCircle(int color){ this.color=color; x=0; y=0; z=0; vx=0; vy=0; vz=0; radius=25; p=new Paint(); p.setColor(color); RadialGradient rg=new RadialGradient(x+10, y-10, radius,color+(0xffffffff-color)/2, color, Shader.TileMode.CLAMP); p.setShader(rg); p.setAntiAlias(true); } public KCircle(int colcr,int x,int y){ this(colcr); this.x=x; this.y=y; } public void drawAndMove(Canvas c){ draw(c); x+=vx; y+=vy; z+=vz; vy+=ay; vx+=ax; vz+=az; } public void moveTo(int x,int y){ this.x=x; this.y=y; } public void draw(Canvas c){ RadialGradient rg=new RadialGradient(x+(25+z/100)/2, y-(25+z/100)/2, 25+z/100,0xffdddddd, color, Shader.TileMode.CLAMP); p.setShader(rg); c.drawCircle(x, y, 25+z/100, p); } public boolean isShouldRemove(){ if(x<-1000||x>1000||y>1000||y<-1000||(25+z/100)<=0||(25+z/100)>150) return true; else return false; } }
上面的图片效果和真实效果有些不同。。。 可能是DDMS的图片抓取机制的问题 看起来有断层,实际是没有的。
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- Android模拟小球自由落体2(重力感应并添加z轴)
- Android模拟小球自由落体2(重力感应并添加z轴)
- android 重力感应小球 Demo
- Android 小球重力感应实现
- Android 小球重力感应实现
- android 重力感应小球 Demo
- 【备忘】Android模拟小球自由落体(SurfaceView)
- 【备忘】Android模拟小球自由落体(SurfaceView)
- Android游戏开发之小球重力感应实现(二十五)
- (转)Android游戏开发之小球重力感应实现(二十五)
- Android游戏开发之小球重力感应实现
- Android游戏开发之小球重力感应实现
- Android游戏开发之小球重力感应实现
- Unity3D学习笔记——Android重力感应控制小球
- Android新手上路——自定义SurfaceView,重力感应小球
- Unity3D学习笔记——Android重力感应控制小球
- Android游戏开发之小球重力感应实现
- Android重力感应(转)
- 关于android中edittext特殊字符过滤和字符长度限制的最优方法
- 第4章, 4.14.2打印1~100之间的素数
- PostgreSQL 中的全局可配置变量
- Vim 配置详解
- android百度地图开发之完善版
- Android模拟小球自由落体2(重力感应并添加z轴)
- 15、javascript脚本语言
- protocol与delegate,代理(委托)与协议总结
- poj017
- 2012华为编程之就餐调查
- Android中使用gzip传递数据
- Qt 子窗口内嵌到父窗口中
- 普通人的编辑利器——Vim
- 面试