Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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 如何转换偏航、横摇和横摇;俯仰值到(x,y)坐标?_Android_Canvas_Android Sensors - Fatal编程技术网

Android 如何转换偏航、横摇和横摇;俯仰值到(x,y)坐标?

Android 如何转换偏航、横摇和横摇;俯仰值到(x,y)坐标?,android,canvas,android-sensors,Android,Canvas,Android Sensors,嗨,在我的应用程序中,我需要创建一个陀螺仪。为此,我使用以下代码 public class AccessGyroscope extends Activity implements SensorEventListener { private TextView tv; private SensorManager sManager; /** Called when the activity is first created. */ @Override publ

嗨,在我的应用程序中,我需要创建一个陀螺仪。为此,我使用以下代码

public class AccessGyroscope extends Activity implements SensorEventListener
{
    private TextView tv;
    private SensorManager sManager;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv = (TextView) findViewById(R.id.tv);
        sManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }

    @Override
    protected void onResume() 
    {
        super.onResume();
        sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST);
    }

    @Override
    protected void onStop() 
    {
        sManager.unregisterListener(this);
        super.onStop();
    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) 
    {
    }

    @Override
    public void onSensorChanged(SensorEvent event) 
    {
        if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        {
            return;
        }

        tv.setText("Orientation X (Roll) :"+ Float.toString(event.values[2]) +"\n"+
                   "Orientation Y (Pitch) :"+ Float.toString(event.values[1]) +"\n"+
                   "Orientation Z (Yaw) :"+ Float.toString(event.values[0]));
    }
}
我可以得到偏航、横摇和俯仰的值,但我想在二维平面上显示。 基本上我想要这样的视图

红点应根据设备的方向移动。我可以在画布上准备视图,但我真正想要的是那些与偏航、横摇和俯仰值相关的坐标


请帮助我,我终于找到了答案

首先,我没有使用类型\方向,而是使用类型\重力

这是我的完整代码

我的自定义视图的代码是

public class GyroscopeView extends View
{
    private final static String TAG = "GyroscopeView";

    private float bearing;
    float pitch = 0;
    float roll = 0;

    private Paint paintOuter;
    private Paint paintInner;
    private Paint paintDot;

    float pointX, pointY;
    float dotX, dotY;
    int radius;

    public GyroscopeView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
        initCompassView();
    }

    public GyroscopeView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        initCompassView();
    }

    public GyroscopeView(Context context)
    {
        super(context);
        // TODO Auto-generated constructor stub
        initCompassView();
    }

    protected void initCompassView()
    {
        setFocusable(true);

        Resources r = this.getResources();

        paintOuter = new Paint(Paint.ANTI_ALIAS_FLAG);
        paintOuter.setColor(Color.WHITE);
        paintOuter.setStrokeWidth(1);
        paintOuter.setStyle(Paint.Style.FILL_AND_STROKE);

        paintInner = new Paint(Paint.ANTI_ALIAS_FLAG);
        paintInner.setColor(Color.BLUE);
        paintInner.setStrokeWidth(1);
        paintInner.setStyle(Paint.Style.STROKE);

        paintDot = new Paint(Paint.ANTI_ALIAS_FLAG);
        paintDot.setColor(Color.RED);
        paintDot.setStrokeWidth(1);
        paintDot.setStyle(Paint.Style.FILL_AND_STROKE);

    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        // TODO Auto-generated method stub
        super.onDraw(canvas);

        int px = getMeasuredWidth() / 2;
        int py = getMeasuredHeight() / 2;
        radius = Math.min(px, py);

        pointX = px;
        pointY = py;

        canvas.drawCircle(pointX, pointY, radius, paintOuter);

        canvas.drawCircle(pointX, pointY, 40, paintInner);
        canvas.drawCircle(dotX, dotY, 5, paintDot);

    }

    void update(float z, float yy, float xx)
    {

        if (yy > 0)
        {
            dotY = pointY - ((1 - yy) * z);
        } else
        {
            dotY = pointY + ((1 - yy) * z);
        }
        if (xx > 0)
        {
            dotX = pointX - ((1 - xx) * z);
        } else
        {
            dotX = pointX + ((1 - xx) * z);
        }
        invalidate();
    }
这是我的活动代码

public class GyroscopeActivity extends Activity
{
    GyroscopeView gyroscopeView;
    SensorManager sensorManager;

    float[] gValues = new float[3];


    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gyroscope);

         gyroscopeView = (GyroscopeView) findViewById(R.id.gyroscope_view);
        initSensor();
    }

    void initSensor()
    {
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        Sensor sensorGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
        sensorManager.registerListener(sensorGyroListener, sensorGyroscope, SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onStop()
    {
        sensorManager.unregisterListener(sensorGyroListener);
        super.onStop();
    }

    private final SensorEventListener sensorGyroListener = new SensorEventListener()
    {
        public void onSensorChanged(SensorEvent event)
        {
            if (event.sensor.getType() == Sensor.TYPE_GRAVITY)
                gValues = event.values;

            gyroscopeView.update(gValues[0], gValues[1], gValues[2]);
        }

        public void onAccuracyChanged(Sensor sensor, int accuracy)
        {
        }
    };
希望这能帮助别人