屏幕显示地图指定的位置,并且流程滚动。
黑色框代表屏幕大小
红色框代表地图大小
。。。想想原理是这样的,但是通过代码怎么实现呢?
忽然想起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; } } }
这是地图的原图,是不是比屏幕要大的多了
![]()