簡體   English   中英

Android Bitmap對齊網格

[英]Android Bitmap snap to grid

有沒有人知道在拖動位圖時是否有一種簡單的方法可以使圖像捕捉到網格?

目前我可以觸摸位圖並在屏幕上平滑移動。 我希望能夠在拖動時將其捕捉到不可見的網格。

這就是我現在正在完成的應用程序中所做的事情。 當用戶在屏幕上拖動某些內容時,我會顯示一個可見的捕捉網格,並且當拖動完成時,該對象將捕捉到該網格。 為了顯示網格,我的方法是使用一個單獨的自定義View ,我將其命名為GridOverLayView 它覆蓋整個屏幕區域,並且非常簡單地在其onDraw()方法中繪制一個捕捉網格。 只有在拖動某些東西時才會顯示它。

現在,關於處理拖放的實際Activity ,我定義的一個特定常量是:

static final int SNAP_GRID_INTERVAL = 20;

當拖動對象時,即在我的OnTouchListener處理event.getAction()==MotionEvent.ACTION_MOVE OnTouchListener事件時,我使用以下內容執行對象的位置捕捉​​到網格:

RelativeLayout.LayoutParams par = (RelativeLayout.LayoutParams) mThingBeingDragged.getLayoutParams();
par.topMargin = Math.round((event.getRawY() - draggedInitialY)   / SNAP_GRID_INTERVAL ) * SNAP_GRID_INTERVAL;  
par.leftMargin = Math.round((event.getRawX() - draggedInitialX)  / SNAP_GRID_INTERVAL ) * SNAP_GRID_INTERVAL;
mThingBeingDragged.setLayoutParams(par);

...其中draggedInitialYdraggedInitialX存儲初始期間記錄的初始觸摸位置MotionEvent.ACTION_DOWN

更好的方法是允許被拖動的對象在沒有捕捉的情況下移動,但是當用戶抬起手指時,只能在.ACTION_UP捕捉到網格。 在實踐中,這感覺使用起來更好。

    private PointF touchDown;
    private int gridCellSize = 10;


    private OnTouchListener touchListener = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub

            switch(event.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                {
                    touchDown = new PointF(event.getRawX(), event.getRawY());
                    break;
                }
                case MotionEvent.ACTION_MOVE:
                {
                    RelativeLayout.LayoutParams par = (RelativeLayout.LayoutParams) v.getLayoutParams();

                    float yDeff = ((event.getRawY() - touchDown.y)   / gridCellSize ) * gridCellSize;
                    float xDeff = ((event.getRawX() - touchDown.x)  / gridCellSize ) * gridCellSize;

                    if(Math.abs(xDeff) >= gridCellSize)
                    {
                        par.leftMargin += (int)(xDeff / gridCellSize) * gridCellSize;
                        touchDown.x = event.getRawX() - (xDeff % gridCellSize);
                    }

                    if(Math.abs(yDeff) >= gridCellSize)
                    {
                        par.topMargin += (int)(yDeff / gridCellSize) * gridCellSize;
                        touchDown.y = event.getRawY() - (yDeff % gridCellSize);
                    }

                    v.setLayoutParams(par);
                    break;
                }
                default :
                {

                    break;
                }
            }


            return true;
        }
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM