io.github.hidroh.materialistic.widget.PeekabooTouchHelperCallback.java Source code

Java tutorial

Introduction

Here is the source code for io.github.hidroh.materialistic.widget.PeekabooTouchHelperCallback.java

Source

/*
 * Copyright (c) 2016 Ha Duy Trung
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.github.hidroh.materialistic.widget;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.View;

import java.util.Locale;

import io.github.hidroh.materialistic.AppUtils;
import io.github.hidroh.materialistic.R;

abstract class PeekabooTouchHelperCallback extends ItemTouchHelper.SimpleCallback {
    private final Paint mPaint = new Paint();
    private final int mPadding;
    private final int mDefaultTextColor;

    PeekabooTouchHelperCallback(Context context) {
        super(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
        mDefaultTextColor = ContextCompat.getColor(context,
                AppUtils.getThemedResId(context, android.R.attr.textColorPrimary));
        mPaint.setTextSize(context.getResources().getDimensionPixelSize(R.dimen.text_size_small));
        mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
        mPadding = context.getResources().getDimensionPixelSize(R.dimen.activity_horizontal_margin);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
            RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX,
            float dY, int actionState, boolean isCurrentlyActive) {
        drawPeekingText(c, viewHolder, dX);
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    }

    private void drawPeekingText(Canvas canvas, RecyclerView.ViewHolder viewHolder, float dX) {
        View itemView = viewHolder.itemView;
        boolean showLeft = dX > 0;
        String text = showLeft ? getLeftText() : getRightText();
        Rect rect = new Rect();
        mPaint.getTextBounds(text, 0, text.length(), rect);
        float textWidth = rect.right - rect.left, textHeight = rect.bottom - rect.top, width = itemView.getWidth(),
                paddingY = (itemView.getHeight() - textHeight) / 2;
        mPaint.setColor(showLeft ? getLeftTextColor() : getRightTextColor());
        mPaint.setAlpha(Math.min(255, (int) (255 / getSwipeThreshold(viewHolder) * Math.abs(dX) / width)));
        canvas.drawText(text.toUpperCase(Locale.getDefault()),
                showLeft ? itemView.getLeft() + mPadding : itemView.getRight() - mPadding - textWidth,
                itemView.getBottom() - paddingY, mPaint);
    }

    @Override
    public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) {
        return 1f / 3;
    }

    @Override
    public float getSwipeEscapeVelocity(float defaultValue) {
        return Float.MAX_VALUE;
    }

    protected abstract String getLeftText();

    protected abstract String getRightText();

    protected int getLeftTextColor() {
        return mDefaultTextColor;
    }

    protected int getRightTextColor() {
        return mDefaultTextColor;
    }
}