根据滑动方向更改视图的颜色

时间:2018-03-06 16:47:56

标签: java android itemtouchhelper

我尝试使用ItemTouchHelper的onChildDraw()方法根据滑动方式改变视图的颜色但是它不起作用:

@Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        final View foregroundView = ((com.lab1.ac01220.bloomv2.ViewHolder) viewHolder).getForeground();

            if(dX < 0){
                this.mData.getViewHolder().getDeleteText().setVisibility(View.VISIBLE);
                this.mData.getViewHolder().getCompleteText().setVisibility(View.INVISIBLE);
                this.mData.getViewHolder().getBackground().setBackgroundColor(getResources().getColor(R.color.colorAccent));
            } else if(dX >0){
                this.mData.getViewHolder().getCompleteText().setVisibility(View.VISIBLE);
                this.mData.getViewHolder().getDeleteText().setVisibility(View.INVISIBLE);
                this.mData.getViewHolder().getBackground().setBackgroundColor(getResources().getColor(R.color.colorComplete));
            }


        ItemTouchHelper.SimpleCallback.getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY,
                actionState, isCurrentlyActive);
    }

问题在于,虽然有些观点有我试图设计的属性,但其他观点并不是,它们保持相同的颜色,文本视图保持可见。

我没有在onChildDrawOver中实现代码,因为我没有看到理由

1 个答案:

答案 0 :(得分:1)

以下代码在向左或向右滑动时更改视图的颜色。它使用OnTouchListener和一些逻辑来区分左右滑动。我知道这与您的方法不同,但它可能会对您有所帮助。

public class demo4 extends AppCompatActivity{

private static final String TAG = "demo4";
private TextView tv;
private View demo4;

private float mDownMotionX = 0;
private float mDownMotionY = 0;

private final int SWIPE_SENSITIVITY = 10;

private final int SWIPE_Y_SENSITIVITY = 20;

private final int SWIPE_X_SENSITIVITY_MIN = 0;
private int SWIPE_X_SENSITIVITY_MAX = 0;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.demo4);
    LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    tv = (TextView) findViewById(R.id.tv);

    SWIPE_X_SENSITIVITY_MAX = getScreenWidth();
    Log.e("Swipe", ""+SWIPE_X_SENSITIVITY_MAX);

    tv.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent ev) {

            Log.e(TAG, "Touch View");
                final int action = ev.getAction();

                switch (action & MotionEvent.ACTION_MASK) {

                    case MotionEvent.ACTION_DOWN:
                        // Remember where the motion event started
                        mDownMotionX = ev.getX();
                        mDownMotionY = ev.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        // Scroll to follow the motion event
                        final float x = ev.getX();
                        final float y = ev.getY();
                        if (Math.abs(x - mDownMotionX) >= SWIPE_SENSITIVITY &&
                                (mDownMotionX > SWIPE_X_SENSITIVITY_MIN &&
                                        mDownMotionX <= SWIPE_X_SENSITIVITY_MAX) &&
                                Math.abs(y - mDownMotionY) <= SWIPE_Y_SENSITIVITY) {

                            if ((x - mDownMotionX) > 0) {
                                tv.setBackgroundColor(Color.RED);
                                Log.d(TAG, "Dragging right");
                            }
                        } else if ((x - mDownMotionX) < 0) {
                            tv.setBackgroundColor(Color.GRAY);
                            Log.d(TAG, "Dragging left");
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                    case MotionEvent.ACTION_CANCEL:
                        break;
                }
                return true;
            }
    });
}

public int getScreenWidth(){

    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics.widthPixels;
}}

下面是布局xml代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">

<TextView
    android:id="@+id/tv"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@android:color/darker_gray"
    android:gravity="center"
    android:textSize="30sp"
    android:text="x"/>

</LinearLayout>