0

I'm trying to change the color of a view depending on the direction of a swipe getsure using ItemTouchHelper's onChildDraw() method but its not working:

@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);
    }

The issue is that while some views have the property I'm trying to design, others don't, they keep the same color and the textviews stay visible.

I've not implemented the code in onChildDrawOver as I dont see a reason to

Adrian Coutsoftides
  • 1,203
  • 1
  • 16
  • 38

1 Answers1

1

The code below changes the color of a view when swiping left or right. It uses OnTouchListener and some logic to distinguish between left and right swipes. I know that this is different from your approach but it may help you.

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;
}}

Below is the layout xml code:

<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>
Brainnovo
  • 1,749
  • 2
  • 12
  • 17