首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在安卓系统中,围绕RelativeLayout拖动一个初始居中的TextView

在安卓系统中,围绕RelativeLayout拖动一个初始居中的TextView
EN

Stack Overflow用户
提问于 2015-06-03 07:18:27
回答 2查看 345关注 0票数 0

所以我在Android中摆弄与触摸事件/手势的交互。我做的第一件事就是在相对布局中创建一个我可以拖动的文本视图。

Java代码是:

代码语言:javascript
复制
public class draggystuff extends ActionBarActivity implements View.OnTouchListener {

private TextView mTextView;
private ViewGroup mRootLayout;
private int _xDelta;
private int _yDelta;

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

    mRootLayout = (ViewGroup) findViewById(R.id.root);
    mTextView = (TextView) mRootLayout.findViewById(R.id.textView);

    RelativeLayout.LayoutParams layoutParams =  (RelativeLayout.LayoutParams) mTextView.getLayoutParams();

    mTextView.setOnTouchListener(this);
}

@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) mTextView.getLayoutParams();

            _xDelta = X - lParams.leftMargin;
            _yDelta = Y - lParams.topMargin;
            Log.d("x is", String.valueOf(_xDelta));
            Log.d("y is", String.valueOf(_yDelta));
            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) mTextView
                    .getLayoutParams();
            layoutParams.leftMargin = X - _xDelta;
            layoutParams.topMargin = Y - _yDelta;
            layoutParams.rightMargin = -250;
            layoutParams.bottomMargin = -250;
            mTextView.setLayoutParams(layoutParams);
            break;
    }
    mRootLayout.invalidate();
    return true;
}
}

这个很好用。当我停止拖动时,它会停留在我离开的地方。

接下来,我决定从屏幕中央的文本视图开始。为此,我修改了OnCreate方法,如下所示:

代码语言:javascript
复制
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_draggystuff);

    mRootLayout = (ViewGroup) findViewById(R.id.root);
    mTextView = (TextView) mRootLayout.findViewById(R.id.textView);

    RelativeLayout.LayoutParams layoutParams =  (RelativeLayout.LayoutParams) mTextView.getLayoutParams();

    layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
    mTextView.setOnTouchListener(this);
}

这样就实现了使TextView居中的目的,但现在当我拖动它时,它将不会移动。我认为这可能是因为居中属性将其锁定在适当的位置。我想,如果在更改坐标之前删除居中属性,可能会起作用。因此,我在ontouch方法中添加了一行代码,如下所示:

代码语言:javascript
复制
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) mTextView.getLayoutParams();

            _xDelta = X - lParams.leftMargin;
            _yDelta = Y - lParams.topMargin;
            Log.d("x is", String.valueOf(_xDelta));
            Log.d("y is", String.valueOf(_yDelta));
            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) mTextView
                    .getLayoutParams();
            layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, 0);
            layoutParams.leftMargin = X - _xDelta;
            layoutParams.topMargin = Y - _yDelta;
            layoutParams.rightMargin = -250;
            layoutParams.bottomMargin = -250;
            mTextView.setLayoutParams(layoutParams);

            break;
    }
    mRootLayout.invalidate();
    return true;
}

然而,现在,文本视图开始于屏幕的中间,但一旦开始拖动,它就会立即移回左上角,然后跟随手指的相对运动!

如何在相对布局中居中文本视图,使其在拖动前既不锁定位置也不移回角落?

EN

回答 2

Stack Overflow用户

发布于 2015-06-03 09:09:43

不使用相对布局,而是尝试线性布局,并在文本视图上使用setGravity(Gravity.CENTER),以查看是否确实是addrule方法导致文本视图忽略任何触摸事件。

另外,您是否尝试过使用XML应用布局参数,并查看问题是否在那里重现?

最后,在向下操作事件或移动操作事件中,文本视图是否移动到左上角?

票数 0
EN

Stack Overflow用户

发布于 2015-06-09 10:32:10

因此,为了解决这个问题,我更改了移动视图的方式。

我的xdelta值和ydelta值如下:

代码语言:javascript
复制
_xDelta = X - mTextView.getX();
_yDelta = Y - mTextView.getY();

然后在我的action_move事件中,我简单地使用了setX和setY方法,而不是设置左边距和上边距,如下所示:

代码语言:javascript
复制
mTextView.setX(X-_xDelta);
mTextView.setY(Y-_yDelta);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30608181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档