Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在画布上绘制文本并更新字符串值_Android_Canvas - Fatal编程技术网

Android 在画布上绘制文本并更新字符串值

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

我是android新手,从sensors项目开始,在这个项目中,当我使用android时,我无法在画布上绘制文本 canvas.drawtext(“gary”,200200,空); 我的应用程序意外停止,实际上我想在画布中获取加速计的值。 请告诉我代码中的错误,并指导我如何在画布上获取值

   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