package com.marshalchen.common.uimodule.materialtabs; import java.util.Locale; import android.animation.Animator; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.marshalchen.common.uimodule.R; import at.markushi.ui.RevealColorView; @SuppressLint({ "InflateParams", "ClickableViewAccessibility" }) /** * A simple Tab with Material Design style * @author neokree * */ public class MaterialTab implements View.OnTouchListener,Animator.AnimatorListener { private final static int REVEAL_DURATION = 400; private final static int HIDE_DURATION = 500; private View completeView; private ImageView icon; private TextView text; private RevealColorView background; private ImageView selector; private Resources res; private MaterialTabListener listener; private Drawable iconDrawable; private int textColor; private int iconColor; private int primaryColor; private int accentColor; private boolean active; private int position; private boolean hasIcon; private float density; private Point lastTouchedPoint; public MaterialTab(Context ctx,boolean hasIcon) { this.hasIcon = hasIcon; density = ctx.getResources().getDisplayMetrics().density; res = ctx.getResources(); if(!hasIcon) { // if there is no icon completeView = LayoutInflater.from(ctx).inflate(R.layout.material_tab, null); text = (TextView) completeView.findViewById(R.id.text); } else { // with icon completeView = LayoutInflater.from(ctx).inflate(R.layout.material_tab_icon, null); icon = (ImageView) completeView.findViewById(R.id.icon); } background = (RevealColorView) completeView.findViewById(R.id.reveal); selector = (ImageView) completeView.findViewById(R.id.selector); // set the listener completeView.setOnTouchListener(this); active = false; textColor = Color.WHITE; // default white text iconColor = Color.WHITE; // and icon } public void setAccentColor(int color) { this.accentColor = color; this.textColor = color; this.iconColor = color; } public void setPrimaryColor(int color) { this.primaryColor = color; background.setBackgroundColor(color); } public void setTextColor(int color) { textColor = color; if(text != null) { text.setTextColor(color); } } public void setIconColor(int color) { this.iconColor = color; if (this.icon != null) this.icon.setColorFilter(color); } public MaterialTab setText(CharSequence text) { this.text.setText(text.toString().toUpperCase(Locale.US)); return this; } public MaterialTab setIcon(Drawable icon) { iconDrawable = icon; this.icon.setImageDrawable(icon); this.setIconColor(this.iconColor); return this; } public void disableTab() { // set 60% alpha to text color if(text != null) this.text.setTextColor(Color.argb(0x99 ,Color.red(textColor), Color.green(textColor), Color.blue(textColor))); // set 60% alpha to icon if(icon != null) setIconAlpha(0x99); // set transparent the selector view this.selector.setBackgroundColor(res.getColor(android.R.color.transparent)); active = false; if(listener != null) listener.onTabUnselected(this); } public void activateTab() { // set full color text if(text != null) this.text.setTextColor(textColor); // set 100% alpha to icon if(icon != null) setIconAlpha(0xFF); // set accent color to selector view this.selector.setBackgroundColor(accentColor); active = true; } public boolean isSelected() { return active; } @Override public boolean onTouch(View v, MotionEvent event) { lastTouchedPoint = new Point(); lastTouchedPoint.x = (int) event.getX(); lastTouchedPoint.y = (int) event.getY(); /* // old effects if(event.getAction() == MotionEvent.ACTION_DOWN ) { // reveal the tab this.background.reveal(point.x, point.y, Color.argb(0x80, Color.red(accentColor), Color.green(accentColor), Color.blue(accentColor)) ,0,250, null); return true; } if(event.getAction() == MotionEvent.ACTION_UP) { // hide reveal this.background.reveal(point.x, point.y, primaryColor,0,700, null); //background.hide(point.x, point.y, primaryColor,0,700, null); // set the click if(listener != null) { if(active) { // if the tab is active when the user click on it it will be reselect listener.onTabReselected(this); } else { listener.onTabSelected(this); } } // if the tab is not activated, it will be active if(!active) this.activateTab(); return true; } */ if(event.getAction() == MotionEvent.ACTION_DOWN) { // do nothing return true; } // new effects if(event.getAction() == MotionEvent.ACTION_UP) { // set the backgroundcolor this.background.reveal(lastTouchedPoint.x, lastTouchedPoint.y, Color.argb(0x80, Color.red(accentColor), Color.green(accentColor), Color.blue(accentColor)) ,0,REVEAL_DURATION, this); // set the click if(listener != null) { if(active) { // if the tab is active when the user click on it it will be reselect listener.onTabReselected(this); } else { listener.onTabSelected(this); } } // if the tab is not activated, it will be active if(!active) this.activateTab(); return true; } return false; } public View getView() { return completeView; } public MaterialTab setTabListener(MaterialTabListener listener) { this.listener = listener; return this; } public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } @SuppressLint({"NewApi"}) private void setIconAlpha(int paramInt) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { this.icon.setImageAlpha(paramInt); return; } this.icon.setColorFilter(Color.argb(paramInt, Color.red(this.iconColor), Color.green(this.iconColor), Color.blue(this.iconColor))); } private int getTextLenght() { String textString = text.getText().toString(); Rect bounds = new Rect(); Paint textPaint = text.getPaint(); textPaint.getTextBounds(textString,0,textString.length(),bounds); return bounds.width(); } private int getIconWidth() { return (int) (density * 24); } public int getTabMinWidth() { if(hasIcon) { return getIconWidth(); } else { return getTextLenght(); } } // AnimatorListener methods @Override public void onAnimationStart(Animator animation) { //this.background.setBackgroundColor(Color.argb(0x80, Color.red(accentColor), Color.green(accentColor), Color.blue(accentColor))); } @Override public void onAnimationEnd(Animator animation) { //this.background.setBackgroundColor(Color.TRANSPARENT); this.background.reveal(lastTouchedPoint.x, lastTouchedPoint.y, primaryColor,0,HIDE_DURATION, null); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }