1

相対レイアウト( )の中央にある可動ボタンを膨らませてContainer、タッチすると画面内Containerで移動できるようにしたいと思います。

コードは次のとおりです。

public void inflate_floating_btn(int k)
    {
        floatButton = new Button(this);
        floatButton.setId(k);
        floatButton.setTag(k);
        final int id_ = floatButton.getId();
        floatButton.setEnabled(true);
        floatButton.setText("hello");   
        floatButton.setTextColor(Color.BLACK);
        floatButton.setBackgroundResource(R.drawable.transparent_btn);

        RelativeLayout.LayoutParams testLP = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        testLP.addRule(RelativeLayout.CENTER_IN_PARENT);
        floatButton.setLayoutParams(testLP);

        Container.addView(floatButton);

        floatButton.setOnTouchListener(new View.OnTouchListener()
        {
          public boolean onTouch(View v, MotionEvent e)
          {
            final int X = (int) e.getRawX();
            final int Y = (int) e.getRawY();
              switch(e.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 = Math.max((X - _xDelta), 0);
                        layoutParams.topMargin = Math.max((Y - _yDelta),0);
                        layoutParams.rightMargin = 0;
                        layoutParams.bottomMargin = 0;
                        v.setLayoutParams(layoutParams);
                        break;
              }

              Container.invalidate();
              return false;
          }
        });
    }

ボタンは画面中央で膨らませることができます。ただし、触っても動かない。

交換する場合

    RelativeLayout.LayoutParams testLP = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    testLP.addRule(RelativeLayout.CENTER_IN_PARENT);
    floatButton.setLayoutParams(testLP);

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(1, 1, 1, 1);

ボタンはタッチで移動できるようになりましたが、relativelayout の左上隅で膨らんでいました。

質問:

移動ボタンが画面の中央で膨らみ、タッチすると移動できるように、コードをどのように改善できますか?

ありがとう!

4

1 に答える 1

0

移動時にビュー マージンを変更する代わりに、ビューの絶対座標を設定するだけです。

drag_button_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

DragButtonFragment.java

public class DragButtonFragment extends Fragment {

    View root;
    float lastX, lastY;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        root = inflater.inflate(R.layout.drag_button_fragment, container, false);
        return root;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        addDragButton();
    }

    private void addDragButton() {
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        Button dragButton = new Button(getActivity());
        dragButton.setLayoutParams(layoutParams);
        dragButton.setText("Drag Me!");
        dragButton.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent ev) {
                final int action = MotionEventCompat.getActionMasked(ev);
                if (action == MotionEvent.ACTION_DOWN) {
                    lastX = ev.getRawX();
                    lastY = ev.getRawY();
                } else if (action == MotionEvent.ACTION_MOVE) {
                    float thisX = ev.getRawX();
                    float thisY = ev.getRawY();
                    v.setX(v.getX() + (thisX - lastX));
                    v.setY(v.getY() + (thisY - lastY));
                    v.invalidate();
                    lastX = thisX;
                    lastY = thisY;
                }
                return false;
            }
        });

        ((ViewGroup) root).addView(dragButton);
    }
}

あなたが探しているものから唯一欠けている部分は、ドラッグされたビューを画面内に保持するgetX()ことです.getWidth()getY()getHeight()rootv

于 2014-12-20T10:28:36.063 に答える