繁体   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