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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM