Android 在画布上绘制文本并更新字符串值
我是android新手,从sensors项目开始,在这个项目中,当我使用android时,我无法在画布上绘制文本 canvas.drawtext(“gary”,200200,空); 我的应用程序意外停止,实际上我想在画布中获取加速计的值。 请告诉我代码中的错误,并指导我如何在画布上获取值Android 在画布上绘制文本并更新字符串值,android,canvas,Android,Canvas,我是android新手,从sensors项目开始,在这个项目中,当我使用android时,我无法在画布上绘制文本 canvas.drawtext(“gary”,200200,空); 我的应用程序意外停止,实际上我想在画布中获取加速计的值。 请告诉我代码中的错误,并指导我如何在画布上获取值 package com.one2; import android.app.Activity; import android.content.Context; import android.gra
package com.one2;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class accelerometer extends Activity implements SensorEventListener {
float x,y,z,sensorX ;
float sensorY,sensorZ;
Bitmap bmp;
SensorManager sm ;
MyBringBackSurface OurSurfaceView;
static final float NS2S = 1.0f / 1000000000.0f;
float[] last_values = null;
float[] velocity = null;
float[] position = null;
long last_timestamp = 0;
public class MyBringBackSurface extends SurfaceView implements Runnable{
SurfaceHolder ourHolder;
Thread ourThread = null;
boolean isRunning = false;
public MyBringBackSurface(Context context) {
super(context);
ourHolder = getHolder();
}
public void pause(){
isRunning = false;
while(true){
try {
ourThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
}
public void resume(){
isRunning = true;
ourThread = new Thread(this);
ourThread.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(isRunning){
if(!ourHolder.getSurface().isValid())
continue;
Canvas canvas = ourHolder.lockCanvas();
canvas.drawRGB(23, 33, 444);
canvas.drawText("gary",200 ,200 , null);
float cx = canvas.getWidth()/2;
float cy = canvas.getHeight()/2;
float fx = cy+sensorY;
float fy = cx+sensorX;
canvas.drawBitmap(bmp,-fx ,-fy,null);
ourHolder.unlockCanvasAndPost(canvas);
}
}
}
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
OurSurfaceView = new MyBringBackSurface(this);
OurSurfaceView.resume();
setContentView(OurSurfaceView);
sm = (SensorManager)getSystemService(SENSOR_SERVICE);
if (sm.getSensorList(Sensor.TYPE_ACCELEROMETER).size()!= 0){
Sensor s = sm.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
sm.registerListener(this, s, SensorManager.SENSOR_DELAY_NORMAL );
}
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.greenball);
x = y =z= sensorX = sensorY = sensorZ = 0;
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
sm.unregisterListener(this);
super.onPause();
}
@Override
public void onSensorChanged(SensorEvent e) {
// TODO Auto-generated method stub
try {
Thread.sleep(16);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
sensorX = e.values[0];
sensorY = e.values[1];
sensorZ= e.values[2];
if(last_values != null){
float dt = (e.timestamp - last_timestamp) * NS2S;
for(int index = 0; index < 3;++index){
velocity[index] += (e.values[index] + last_values[index])/2 * dt;
position[index] += velocity[index] * dt;
}
}
else{
last_values = new float[3];
velocity = new float[3];
position = new float[3];
velocity[0] = velocity[1] = velocity[2] = 0f;
position[0] = position[1] = position[2] = 0f;
}
System.arraycopy(e.values, 0, last_values, 0, 3);
last_timestamp = e.timestamp;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}
09-05 09:21:11.241: E/AndroidRuntime(960): FATAL EXCEPTION: Thread-89
09-05 09:21:11.241: E/AndroidRuntime(960): java.lang.NullPointerException
09-05 09:21:11.241: E/AndroidRuntime(960): at android.graphics.Canvas.drawText(Canvas.java:1377)
09-05 09:21:11.241: E/AndroidRuntime(960): at com.one2.accelerometer$MyBringBackSurface.run(accelerometer.java:65)
09-05 09:21:11.241: E/AndroidRuntime(960): at java.lang.Thread.run(Thread.java:841)
package com.one2;
导入android.app.Activity;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.Canvas;
导入android.hardware.Sensor;
导入android.hardware.SensorEvent;
导入android.hardware.SensorEventListener;
导入android.hardware.SensorManager;
导入android.os.Bundle;
导入android.view.SurfaceHolder;
导入android.view.SurfaceView;
公共类加速计扩展活动实现SensorEventListener{
浮动x、y、z、传感器x;
浮动感官,sensorZ;
位图bmp;
传感器管理器sm;
MyBringBackSurface我们的surfaceview;
静态最终浮子NS2S=1.0f/100000000.0f;
float[]last_value=null;
float[]速度=零;
float[]位置=空;
长最后时间戳=0;
公共类MyBringBackSurface扩展了SurfaceView实现Runnable{
表面持有人;
线程ourThread=null;
布尔值isRunning=false;
公共MyBringBackSurface(上下文){
超级(上下文);
ourHolder=getHolder();
}
公共空间暂停(){
isRunning=false;
while(true){
试一试{
ourThread.join();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
打破
}
}
公众简历(){
isRunning=true;
ourThread=新线程(此线程);
ourThread.start();
}
@凌驾
公开募捐{
//TODO自动生成的方法存根
同时(正在运行){
如果(!ourHolder.getSurface().isValid())
继续;
Canvas Canvas=ourHolder.lockCanvas();
画布.drawRGB(23,33,444);
drawText(“gary”,200200,空);
float cx=canvas.getWidth()/2;
float cy=canvas.getHeight()/2;
浮动fx=cy+感官;
浮动fy=cx+传感器X;
drawBitmap(bmp,-fx,-fy,null);
我们的持有者。解锁CanvasandPost(画布);
}
}
}
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
OurSurfaceView=新的MyBringBackSurface(此);
我们的surfaceview.resume();
setContentView(我们的SurfaceView);
sm=(传感器管理器)getSystemService(传感器服务);
if(sm.getSensorList(Sensor.TYPE_Accelerator).size()!=0){
传感器s=sm.getSensorList(传感器类型\加速计).get(0);
sm.registerListener(此,s,SensorManager.SENSOR\u延迟\u正常);
}
bmp=BitmapFactory.decodeResource(getResources(),R.drawable.greenball);
x=y=z=传感器x=传感器z=0;
}
@凌驾
受保护的void onPause(){
//TODO自动生成的方法存根
sm.取消注册侦听器(此);
super.onPause();
}
@凌驾
传感器更改时的公共无效(传感器事件e){
//TODO自动生成的方法存根
试一试{
睡眠(16);
}捕捉(中断异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
sensorX=e.值[0];
感官=e.值[1];
sensorZ=e.值[2];
如果(最后的_值!=null){
float dt=(e.时间戳-最后一个时间戳)*NS2S;
对于(int-index=0;index<3;++index){
速度[指数]+=(e.值[指数]+最后的值[指数])/2*dt;
位置[指数]+=速度[指数]*dt;
}
}
否则{
最后的_值=新浮动[3];
速度=新浮点数[3];
位置=新浮动[3];
速度[0]=速度[1]=速度[2]=0f;
位置[0]=位置[1]=位置[2]=0f;
}
数组复制(e.values,0,last_值,0,3);
最后的时间戳=e.时间戳;
}
@凌驾
精度更改时的公共无效(传感器,int精度){
//TODO自动生成的方法存根
}
}
09-05 09:21:11.241:E/AndroidRuntime(960):致命异常:线程-89
09-05 09:21:11.241:E/AndroidRuntime(960):java.lang.NullPointerException
09-05 09:21:11.241:E/AndroidRuntime(960):在android.graphics.Canvas.drawText(Canvas.java:1377)上
09-05 09:21:11.241:E/AndroidRuntime(960):在com.one2.accelerator$MyBringBackSurface.run(accelerator.java:65)
09-05 09:21:11.241:E/AndroidRuntime(960):在java.lang.Thread.run(Thread.java:841)处
画布。drawText
的第四个参数必须是绘制对象。您不能传递null
。因此,您应该创建一个新对象并传递它:
Paint paint = new Paint();
paint.setColor(Color.BLACK);
canvas.drawText("gary",200,200,paint);
请告诉我如何将加速度计值传递到drawtext中的字符串值…您可以使用string.valueOf
将浮点值转换为string
对象。传感器值是否会从一个浮点值更新到另一个字符串。或者我是否应该使用任何其他方法。谢谢,我得到了:)cliffroot