2

これが私のレイアウトです。2 つのビューがあり、一方を他方に移動します。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/time_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RelativeLayout
        android:id="@+id/slide_layout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="20dp"
        android:layout_alignParentBottom="true" >

        <View
            android:id="@+id/slide_to_pause_backgound"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:background="#0000FF" />

        <View
            android:id="@+id/slide_to_pause"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignLeft="@+id/slide_to_pause_backgound"
            android:layout_alignParentBottom="true"
            android:background="#00FFFF" />
    </RelativeLayout>

これは、移動するビューをアクティビティ クラスに設定する方法です。

slideView = ((View) findViewById(R.id.slide_to_pause));
slideView.setOnTouchListener(this);   

そして、これは私がビューを移動する方法です:

@Override
public boolean onTouch(View view, 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) view.getLayoutParams();
        viewLeftMargin = X - lParams.leftMargin;
        viewTopMargin = lParams.topMargin;  
        viewBottomMargin = lParams.bottomMargin;
        viewRightMargin = X - lParams.rightMargin;
        break;

    case MotionEvent.ACTION_MOVE:
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
        layoutParams.rightMargin = X - viewRightMargin;
        layoutParams.leftMargin = X - viewLeftMargin;           
        layoutParams.topMargin = viewTopMargin;
        layoutParams.bottomMargin = viewBottomMargin;
        view.setLayoutParams(layoutParams);         

        break;
    }
    return true;
    }
}

右に行ったときと左に行ったときに別のアクションを実行したい。

これどうやってするの?ありがとうございました!

4

2 に答える 2

4

これを試して:

package com.example.motionevent;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.RelativeLayout;

public class MainActivity extends Activity implements OnTouchListener {

    private int viewLeftMargin;
    private int viewTopMargin;
    private int viewBottomMargin;
    private int viewRightMargin;
    private int lastMarginLeft;
    private int lastMarginRight;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View slideView = (View) findViewById(R.id.slide_to_pause);
        slideView.setOnTouchListener(this);
        RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) slideView
                .getLayoutParams();
        lastMarginLeft = lParams.leftMargin;
        lastMarginRight = lParams.rightMargin;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        // TODO Auto-generated method stub
        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) view
                    .getLayoutParams();
            viewLeftMargin = X - lParams.leftMargin;
            viewTopMargin = lParams.topMargin;
            viewBottomMargin = lParams.bottomMargin;
            viewRightMargin = X - lParams.rightMargin;
            break;

        case MotionEvent.ACTION_MOVE:
            RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
                    .getLayoutParams();
            layoutParams.rightMargin = X - viewRightMargin;
            layoutParams.leftMargin = X - viewLeftMargin;
            layoutParams.topMargin = viewTopMargin;
            layoutParams.bottomMargin = viewBottomMargin;
            view.setLayoutParams(layoutParams);
            if (layoutParams.leftMargin > lastMarginLeft) {
                Log.d("ON_TOUCH", "Moving to right!");
                lastMarginLeft = layoutParams.leftMargin;
                                lastMarginRight = layoutParams.rightMargin; // Here
            } else {
                Log.d("ON_TOUCH", "Moving to left!");
                lastMarginRight = layoutParams.rightMargin;
                lastMarginLeft = layoutParams.leftMargin; // and here
            }
            break;
        }
        return true;
    }

}
于 2012-12-03T18:01:40.557 に答える
1

ビューの最初のタッチの X 位置を記憶し、移動アクションで、そのポイントと現在の位置の違いを確認して、ユーザーが左または右に移動しているかどうかを判断します (スライドの左/右のデフォルトを考慮して可能)距離):

public static final int MOVE_SIZE = 30;
public int mStartingX = -1000;

@Override
public boolean onTouch(View view, MotionEvent event) {
    final int X = (int) event.getX();
    final int Y = (int) event.getY();

    switch (event.getAction() & MotionEvent.ACTION_MASK) {

    case MotionEvent.ACTION_DOWN:
        mStartingX = X;
        RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
        viewLeftMargin = X - lParams.leftMargin;
        viewTopMargin = lParams.topMargin;  
        viewBottomMargin = lParams.bottomMargin;
        viewRightMargin = X - lParams.rightMargin;
        break;

    case MotionEvent.ACTION_MOVE:
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
        layoutParams.rightMargin = X - viewRightMargin;
        layoutParams.leftMargin = X - viewLeftMargin;           
        layoutParams.topMargin = viewTopMargin;
        layoutParams.bottomMargin = viewBottomMargin;
        view.setLayoutParams(layoutParams);         
        if (mStartingX != -1000 && X >= mCurrentX + MOVE_SIZE) {
            doActionRight(); 
        } else if (mStartingtX != -1000 && X < mStartingX - MOVE_SIZE) {
            doActionLeft();
        }
        break;
    case MotionEvent.ACTION_UP:
        mStartingX = -1000;
        break;
于 2012-12-03T18:02:29.323 に答える