【Android原创】自定义SurfaceViews实现地图移动

来源:互联网 发布:做微商可以淘宝进货吗 编辑:程序博客网 时间:2024/05/18 00:18


屏幕显示地图指定的位置,并且流程滚动。

黑色框代表屏幕大小

红色框代表地图大小

。。。

想想原理是这样的,但是通过代码怎么实现呢?



忽然想起createBitmap可以截取某一片区域

于是乎准备自定义SurfaceView

因为SurfaceView是独立线程,所以优先考虑

package com.ask.jilun.view;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.WindowManager;import com.ask.jilun.R;/** */public class MapsView extends SurfaceView implements SurfaceHolder.Callback , Runnable {    private SurfaceHolder surfaceHolder;    private Context context;    private int windowWidth;//屏幕宽高    private int windowHeight;    private boolean isRunning;    private Paint paint;    private Bitmap mapBitmap;//地图    private int mapBitmapWidth;//地图的宽高    private int mapBitmapHeight;    private Bitmap nowBitmap;//现在显示的部分    private Thread thread;    private int startX,startY;//开始剪裁的位置      public MapsView(Context context,int startX ,int startY) {        super(context);        this.context = context;        surfaceHolder = getHolder();        surfaceHolder.addCallback(this);        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        windowWidth = wm.getDefaultDisplay().getWidth();        windowHeight = wm.getDefaultDisplay().getHeight();        this.startX = startX;        this.startY = startY;        paint = new Paint();        mapBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.mapfengyuegu);        mapBitmapWidth = mapBitmap.getWidth();        mapBitmapHeight = mapBitmap.getHeight();        isRunning = true;    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        thread = new Thread(this);        thread.start();    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        isRunning = false;        thread.destroy();//销毁线程    }    @Override    public void run() {        Canvas canvas = null;        while (isRunning){            synchronized (surfaceHolder) {                canvas = surfaceHolder.lockCanvas(null);                doDraw(canvas,startX,startY);                try {                    Thread.sleep(10);//刷新频率                } catch (InterruptedException e) {                    e.printStackTrace();                }finally {                    surfaceHolder.unlockCanvasAndPost(canvas);                }            }            startX += 10;            startY += 10;        }    }    /**     * 根据移动的距离在地图中剪裁对应的位置     * @param canvas     * @param startX 开始的X     * @param startY 开的的Y     *     *               注意:开始剪裁的X+WindowX Y+WindowY 不能大于mapBitmap     */    private void doDraw(Canvas canvas ,int startX , int startY) {        if(startX+windowWidth <= mapBitmapWidth && startY+windowHeight <= mapBitmapHeight){            nowBitmap = Bitmap.createBitmap(mapBitmap,startX,startY,windowWidth,windowHeight);            canvas.drawBitmap(nowBitmap,this.startX,this.startY,paint);        }else{            isRunning = false;        }    }}

这是地图的原图,是不是比屏幕要大的多了

                                             
0 0
原创粉丝点击