百度地图、 SurfaceView

百度地图

记住如何获得数字签名,如何申请PAI key。
无论何种需求、何种查找,在百度给的Demo中都能找到应用
写一个显示地图的最简单的例子

public class MainActivity extends Activity {
    MapView mMapView ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }
    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }

SurfaceView

重点在于如何将传感器获得的转动角度,传到自己写的SurfaceView中去,然后使画布旋转,需要一个setter方法和handler。

package com.example.administrator.mysensordemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

/**
 * Created by Administrator on 2015/9/21.
 */
public class MyView extends SurfaceView{
    private int width;
    private int height;
    private Paint mPaint;
    private Paint mPaintLine;
    private Paint mPaintSign;
    private float mDegree;
    private Canvas canvas;

    public void setmDegree(float mDegree) {
        this.mDegree = mDegree;
        invalidate();
        Log.d("onSensorChanged","旋转角度"+mDegree);
    }

    public MyView(Context context) {
        super(context);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        SurfaceHolder surfaceHolder = getHolder();//得到Holder
        surfaceHolder.addCallback(callback);//绑定Holder的回调

        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setStrokeWidth(10);
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.STROKE);

        mPaintLine = new Paint();
        mPaintLine.setColor(Color.GREEN);
        mPaintLine.setStrokeWidth(5);
        mPaintLine.setAntiAlias(true);
        mPaintLine.setStyle(Paint.Style.STROKE);

        mPaintSign = new Paint();
        mPaintSign.setColor(Color.BLUE);
        mPaintSign.setTextSize(40);
        mPaintSign.setAntiAlias(true);
        mPaintSign.setTextAlign(Paint.Align.CENTER);
        mPaintSign.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec);
        setMeasuredDimension(width, height);
    }

    Callback callback = new Callback() {
        @Override
        public void surfaceCreated(final SurfaceHolder surfaceHolder) {
             Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true){

                    canvas = surfaceHolder.lockCanvas();
                    canvas.drawColor(Color.WHITE);
                    canvas.save();
                    canvas.rotate(mDegree, width / 2, height / 2);
                    canvas.drawCircle(width / 2, height / 2, 300, mPaint);
                    canvas.drawCircle(width / 2, height / 2, 5, mPaintLine);
                    canvas.drawLine(width / 2, height / 2, width / 2, height / 2 + 250, mPaintLine);
                    canvas.drawLine(width / 2, height / 2 + 250, width / 2 - 10, height / 2 + 230, mPaintLine);
                    canvas.drawLine(width / 2, height / 2+250, width / 2+10, height / 2 + 230, mPaintLine);
//                    canvas.restore();

//                    canvas.save();
                    canvas.drawText("N", width / 2, height / 2 - 260, mPaintSign);
                    canvas.rotate(90, width / 2, height / 2);
                    canvas.drawText("E", width / 2, height / 2 - 260, mPaintSign);
                    canvas.rotate(90, width / 2, height / 2);
                    canvas.drawText("S", width / 2, height / 2 - 260, mPaintSign);
                    canvas.rotate(90, width / 2, height / 2);
                    canvas.drawText("W", width / 2, height / 2 - 260, mPaintSign);
                    canvas.restore();
                    surfaceHolder.unlockCanvasAndPost(canvas);
                    try {
                        Thread.sleep(40);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                }
            });
            thread.start();
        }

        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

        }
    };
}

传感器(地磁、加速度)

package com.example.administrator.mysensordemo;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;


public class MainActivity extends Activity {
    private SensorManager mSensorManager;
    private MyView myView;
    private static final int DEGREE = 0X23;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case DEGREE:
                    float angle = (float) msg.obj;
                    myView.setmDegree(angle);


            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myView = (MyView) findViewById(R.id.myview);

        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor magneticSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

        mSensorManager.registerListener(listener,magneticSensor,SensorManager.SENSOR_DELAY_GAME);
        mSensorManager.registerListener(listener,accelerometerSensor,SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mSensorManager!=null){
            mSensorManager.unregisterListener(listener);
        }
    }

    private SensorEventListener listener = new SensorEventListener() {
        float[] accelerometerValues = new float[3];
        float[] magneticValues = new float[3];
        private float lastRotateDegree;
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
                accelerometerValues = sensorEvent.values.clone();
            }else if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
                magneticValues = sensorEvent.values.clone();
            }
            float[] R = new float[9];
            float[] values = new float[3];
            SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
            SensorManager.getOrientation(R, values);
//            Log.d("onSensorChanged","旋转角度"+Math.toDegrees(values[0]));
            float rotateDegree = (float) -Math.toDegrees(values[0]);
            if (Math.abs(rotateDegree - lastRotateDegree)>1){
//                RotateAnimation animation = new RotateAnimation(lastRotateDegree,rotateDegree, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
//                animation.setFillAfter(true);
//                myView.startAnimation(animation);
                Message msg = new Message();
                msg.what = DEGREE;
                msg.obj = rotateDegree;
                handler.sendMessage(msg);
                lastRotateDegree = rotateDegree;
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {

        }
    };
}

2016.10.11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值