如何创建一个不可思议/可移动的布局? "无尽的纸张" -Metapher

时间:2015-05-11 09:40:20

标签: android android-layout

如何制作无尽/可移动的布局,无处不在/可以向各个方向移动? 我想开发一个应用程序来创建图表,如果图表太大,我希望它可以向各个方向移动。

我希望它是可以理解的。

关于

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_draw);



        _root = (ViewGroup) findViewById(R.id.draw);
        _view = new ImageView(this);
        _view.setImageResource(R.drawable.greenbutton);
        BitmapDrawable bd=(BitmapDrawable) this.getResources().getDrawable(R.drawable.greenbutton);
        int height=bd.getBitmap().getHeight();
        int width=bd.getBitmap().getWidth();

        /*MyScrollView myV = new MyScrollView(this);
        myV.setLayoutParams(_root.getLayoutParams());*/

        RelativeLayout.LayoutParams layoutParams=new RelativeLayout.LayoutParams(height,width);
        _view.setLayoutParams(layoutParams);

        _view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                final int X = (int) event.getRawX();
                final int Y = (int) event.getRawY();
                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:
                        RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
                        _xDelta = X - lParams.leftMargin;
                        _yDelta = Y - lParams.topMargin;
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                    case MotionEvent.ACTION_POINTER_DOWN:
                        break;
                    case MotionEvent.ACTION_POINTER_UP:
                        break;
                    case MotionEvent.ACTION_MOVE:
                        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
                        layoutParams.leftMargin = X - _xDelta;
                        layoutParams.topMargin = Y - _yDelta;
                        layoutParams.rightMargin = -250;
                        layoutParams.bottomMargin = -250;
                        v.setLayoutParams(layoutParams);
                        break;
                }
                _root.invalidate();
                return true;
            }
        });
        //myV.addView(_view);
        _root.addView(_view);

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_draw); _root = (ViewGroup) findViewById(R.id.draw); _view = new ImageView(this); _view.setImageResource(R.drawable.greenbutton); BitmapDrawable bd=(BitmapDrawable) this.getResources().getDrawable(R.drawable.greenbutton); int height=bd.getBitmap().getHeight(); int width=bd.getBitmap().getWidth(); /*MyScrollView myV = new MyScrollView(this); myV.setLayoutParams(_root.getLayoutParams());*/ RelativeLayout.LayoutParams layoutParams=new RelativeLayout.LayoutParams(height,width); _view.setLayoutParams(layoutParams); _view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { final int X = (int) event.getRawX(); final int Y = (int) event.getRawY(); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); _xDelta = X - lParams.leftMargin; _yDelta = Y - lParams.topMargin; break; case MotionEvent.ACTION_UP: break; case MotionEvent.ACTION_POINTER_DOWN: break; case MotionEvent.ACTION_POINTER_UP: break; case MotionEvent.ACTION_MOVE: RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); layoutParams.leftMargin = X - _xDelta; layoutParams.topMargin = Y - _yDelta; layoutParams.rightMargin = -250; layoutParams.bottomMargin = -250; v.setLayoutParams(layoutParams); break; } _root.invalidate(); return true; } }); //myV.addView(_view); _root.addView(_view);

1 个答案:

答案 0 :(得分:0)

创建一个滚动的自定义视图(手动执行)并将所有内容保存在两个变量中,让我们说滚动和滚动(假设屏幕左上角的点)。因此,使用scrollX和scrollY的偏移量绘制所有内容。

以下是一些代码:

public class MyScrollView extends View
{
    private int scrollX, scrollY;
    private int pinPointX, pinPointY;

    public MyScrollView(Context context)
    {
        super(context);

        //Initialize scroll to look at the top left edge of the "paper"
        scrollX = 0;
        scrollY = 0;
    }

    public void onTouchEvent(MotionEvent e)
    {
        switch (e.getAction())
        {
            case MotionEvent.ACTION_DOWN:
                //Mark touch point
                pinPointX = (int) e.getX();
                pinPointY = (int) e.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                //Scroll view
                scrollX += (int) e.getX() -pinPointX;
                scrollY += (int) e.getY() -pinPointY;

                //Mark new point
                pinPointX = (int) e.getX();
                pinPointY = (int) e.getY();
                break;
        }
    }

    @Override
    public void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        //Draw everything here with an offset of scrollX, scrollY
    }
}

抱歉,我可能犯了一些错误(主要是使用android的类名),但我在旅途中编写了代码,如果你发现任何小错误,请务必纠正错误。

请注意,此代码允许您无限滚动"至少只要scrollX和scrollY保持在他们的int限制(从-2,147,483,648到2,147,483,647)你可以保持这样,因为没有人会滚动那么远,但我建议应用一些限制只是为了让应用程序更多& #34;完美"

此外我还不确定,但我认为如果滚动到负面(向左和向上 - 当scrollX和/或scrollY为负数时),此代码可能会出现问题,但我可能错了。

如果您想要包含更多观看次数(例如您提出的布局),请将其设为ViewGroup,但我没有多少经验可以使用它。我向您展示了遵循它的逻辑,并根据您的喜好将其附加到您的代码中。