android - 使用加速度计移动对象

标签 android android-canvas

你好 :) 我创建了一个上面有球的黄色 Canvas ,现在我正在尝试移动球,但我不知道如何移动,这是我第一次使用加速度计,也是我第一次使用canvas and draw..所以你能帮我移动它吗?

到目前为止,这是我的代码:

     package com.example.theball;

import android.support.v4.widget.DrawerLayout.LayoutParams;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.SensorEvent;
import android.os.Bundle;
import android.view.Display;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {
private int c = Color.YELLOW;
private Canvas g;
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_main);
    draw();
    }
@SuppressWarnings("deprecation")
public void draw ()
{
    Display display = getWindowManager().getDefaultDisplay();
    int width = display.getHeight();
    int height = display.getWidth();
    Bitmap bitmap = Bitmap.createBitmap(width, height, Config.RGB_565);
    g = new Canvas(bitmap);
    g.drawColor(c);
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    g.drawCircle(50, 10, 25, paint); 
    ImageView imageView = new ImageView(this);
    imageView.setImageBitmap(bitmap);
    RelativeLayout layout = new RelativeLayout(this);
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
    LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.CENTER_IN_PARENT);
    layout.addView(imageView, params);
    layout.setBackgroundColor(Color.BLACK);
    setContentView(layout);   
}
public void onSensorChanged(SensorEvent event)
{

}

}

最佳答案

已解决:这是新代码,感谢来自 stackoverflow 的人:

    package com.example.theball;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ImageView;

@SuppressWarnings("deprecation") public class MainActivity extends Activity implements SensorEventListener {
     private SensorManager sensorManager;
        private Sensor accelerometer;
        private long lastUpdate;

        AnimatedView animatedView = null;
        ShapeDrawable mDrawable = new ShapeDrawable();
        public static int x;
        public static int y;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // setContentView(R.layout.activity_main);

            sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            accelerometer = sensorManager
                    .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            lastUpdate = System.currentTimeMillis();

            animatedView = new AnimatedView(this);
            setContentView(animatedView);
        }

        @Override
        protected void onResume() {
            super.onResume();
            sensorManager.registerListener(this, accelerometer,
                    SensorManager.SENSOR_DELAY_GAME);
        }

        @Override
        protected void onPause() {
            super.onPause();
            sensorManager.unregisterListener(this);
        }


        @Override
        public void onAccuracyChanged(Sensor arg0, int arg1) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

                x -= (int) event.values[0];
                y += (int) event.values[1];

            }
        }

        public class AnimatedView extends ImageView {

            static final int width = 50;
            static final int height = 50;

            public AnimatedView(Context context) {
                super(context);
                // TODO Auto-generated constructor stub

                mDrawable = new ShapeDrawable(new OvalShape());
                mDrawable.getPaint().setColor(0xffffAC23);
                mDrawable.setBounds(x, y, x + width, y + height);

            }

            @Override
            protected void onDraw(Canvas canvas) {

                mDrawable.setBounds(x, y, x + width, y + height);
                mDrawable.draw(canvas);
                invalidate();
            }
        }

    }

关于android - 使用加速度计移动对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24595913/

相关文章:

android - 在进度更新时滚动 TextView

kotlin - 我如何在 Android Jetpack Compose 中的 Canvas 上绘制单侧加厚描边?

android - 在 Android 上保存自定义 View 的屏幕截图

android - 如何持久化retrofit或okhttp RequestBody,稍后进行网络调用

java - 在 Android 中绘制椭圆形可以,但绘制矩形不行

java - 将图像转换为二维数组仅获取左上象限

java - 在 Android 中将 vector 路径移动到固定位置

java - 如何通过广播接收器启动 Activity

android - 如何在 Android 中创建页眉内容布局?

将参数传递给方法的 Android 数据绑定(bind)