Android SurfaceView实现跟随手指移动的光标

实例

public class DragSurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable{
    private int screenW;        //屏幕宽度
    private int screenH;        //屏幕高度
    private float cx = 100;      //默认X坐标
    private float cy = 100;      //默认Y坐标
    private Bitmap mBitmap;
    private SurfaceHolder mSurfaceHolder = null;
    private Thread thread = null;
    public DragSurfaceView(Context context,@Nullable AttributeSet attrs) {
        super(context,attrs);
        mSurfaceHolder = getHolder();
        mSurfaceHolder.addCallback(this);
        mBitmap=getBitmapResources(context,R.drawable.x1);
        thread=new Thread(this);

    }
    public static Bitmap getBitmapResources(Context context,int resId){
         return BitmapFactory.decodeResource(context.getResources(),resId);
   }

    protected void myDraw() {
        //获取canvas实例
        Canvas canvas = mSurfaceHolder.lockCanvas();
        //将屏幕设置为白色
        canvas.drawColor(Color.WHITE);
        //绘制图片和位置
        canvas.drawBitmap(mBitmap,cx,cy,null);
        //将画好的画布提交
        mSurfaceHolder.unlockCanvasAndPost(canvas);
    }

    @Override
    public void run() {
        while(true){
            try{
                myDraw();
                Thread.sleep(100);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 按下
                cx = (int) event.getX();
                cy = (int) event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                // 移动
                cx = (int) event.getX();
                cy = (int) event.getY();
                break;
            case MotionEvent.ACTION_UP:
                // 抬起
                cx = (int) event.getX();
                cy = (int) event.getY();
                break;
        }
        return true;
    }

    //surface创建的时候调用
    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        //获取屏幕高度
        screenW = getWidth();
        screenH = getHeight();
        thread.start();
    }

    //surface被改变的时候调用
    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

    }

    //surface销毁的时候调用
    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        doRecycledIfNot(mBitmap);
    }

    //回收一个未被回收的Bitmap
    public static void doRecycledIfNot(Bitmap bitmap) {
        if (!bitmap.isRecycled()) {
            bitmap.recycle();
        }
    }
}

 相关阅读

了解SurfaceView

posted @ 2018-08-16 16:56  YangBryant  阅读(1645)  评论(0编辑  收藏  举报