/*
* android-spinnerwheel
* https://github.com/ai212983/android-spinnerwheel
*
* based on
*
* Android Wheel Control.
* https://code.google.com/p/android-wheel/
*
* Copyright 2011 Yuri Kanivets
*
* 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 antistatic.spinnerwheel;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import com.ectrip.trips.check.R;
/**
* Abstract spinner spinnerwheel view.
* This class should be subclassed.
*
* @author Yuri Kanivets
* @author Dimitri Fedorov
*/
public abstract class AbstractWheelView extends AbstractWheel {
private static int itemID = -1;
@SuppressWarnings("unused")
private final String LOG_TAG = AbstractWheelView.class.getName() + " #" + (++itemID);
//----------------------------------
// Default properties values
//----------------------------------
protected static final int DEF_ITEMS_DIMMED_ALPHA = 50; // 60 in ICS
protected static final int DEF_SELECTION_DIVIDER_ACTIVE_ALPHA = 70;
protected static final int DEF_SELECTION_DIVIDER_DIMMED_ALPHA = 70;
protected static final int DEF_ITEM_OFFSET_PERCENT = 10;
protected static final int DEF_ITEM_PADDING = 10;
protected static final int DEF_SELECTION_DIVIDER_SIZE = 2;
//----------------------------------
// Class properties
//----------------------------------
// configurable properties
/** The alpha of the selector spinnerwheel when it is dimmed. */
protected int mItemsDimmedAlpha;
/** The alpha of separators spinnerwheel when they are shown. */
protected int mSelectionDividerActiveAlpha;
/** The alpha of separators when they are is dimmed. */
protected int mSelectionDividerDimmedAlpha;
/** Top and bottom items offset */
protected int mItemOffsetPercent;
/** Left and right padding value */
protected int mItemsPadding;
/** Divider for showing item to be selected while scrolling */
protected Drawable mSelectionDivider;
// the rest
/**
* The {@link android.graphics.Paint} for drawing the selector.
*/
protected Paint mSelectorWheelPaint;
/**
* The {@link android.graphics.Paint} for drawing the separators.
*/
protected Paint mSeparatorsPaint;
/**
* {@link com.nineoldandroids.animation.Animator} for dimming the selector spinnerwheel.
*/
protected Animator mDimSelectorWheelAnimator;
/**
* {@link com.nineoldandroids.animation.Animator} for dimming the selector spinnerwheel.
*/
protected Animator mDimSeparatorsAnimator;
/**
* The property for setting the selector paint.
*/
protected static final String PROPERTY_SELECTOR_PAINT_COEFF = "selectorPaintCoeff";
/**
* The property for setting the separators paint.
*/
protected static final String PROPERTY_SEPARATORS_PAINT_ALPHA = "separatorsPaintAlpha";
protected Bitmap mSpinBitmap;
protected Bitmap mSeparatorsBitmap;
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
public AbstractWheelView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
//--------------------------------------------------------------------------
//
// Initiating assets and setters for paints
//
//--------------------------------------------------------------------------
@Override
protected void initAttributes(AttributeSet attrs, int defStyle) {
super.initAttributes(attrs, defStyle);
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.AbstractWheelView, defStyle, 0);
mItemsDimmedAlpha = a.getInt(R.styleable.AbstractWheelView_itemsDimmedAlpha, DEF_ITEMS_DIMMED_ALPHA);
mSelectionDividerActiveAlpha = a.getInt(R.styleable.AbstractWheelView_selectionDividerActiveAlpha, DEF_SELECTION_DIVIDER_ACTIVE_ALPHA);
mSelectionDividerDimmedAlpha = a.getInt(R.styleable.AbstractWheelView_selectionDividerDimmedAlpha, DEF_SELECTION_DIVIDER_DIMMED_ALPHA);
mItemOffsetPercent = a.getInt(R.styleable.AbstractWheelView_itemOffsetPercent, DEF_ITEM_OFFSET_PERCENT);
mItemsPadding = a.getDimensionPixelSize(R.styleable.AbstractWheelView_itemsPadding, DEF_ITEM_PADDING);
mSelectionDivider = a.getDrawable(R.styleable.AbstractWheelView_selectionDivider);
a.recycle();
}
@Override
protected void initData(Context context) {
super.initData(context);
// creating animators
mDimSelectorWheelAnimator = ObjectAnimator.ofFloat(this, PROPERTY_SELECTOR_PAINT_COEFF, 1, 0);
mDimSeparatorsAnimator = ObjectAnimator.ofInt(this, PROPERTY_SEPARATORS_PAINT_ALPHA,
mSelectionDividerActiveAlpha, mSelectionDividerDimmedAlpha
);
// creating paints
mSeparatorsPaint = new Paint();
mSeparatorsPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
mSeparatorsPaint.setAlpha(mSelectionDividerDimmedAlpha);
mSelectorWheelPaint = new Paint();
mSelectorWheelPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
}
/**
* Recreates assets (like bitmaps) when layout size has been changed
*
* @param width New spinnerwheel width
* @param height New spinnerwheel height
*/
@Override
protected void recreateAssets(int width, int height) {
mSpinBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
mSeparatorsBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
setSelectorPaintCoeff(0);
}
/**
* Sets the alpha
of the {@link Paint} for drawing separators
* spinnerwheel.
* @param alpha alpha value from 0 to 255
*/
@SuppressWarnings("unused") // Called via reflection
public void setSeparatorsPaintAlpha(int alpha) {
mSeparatorsPaint.setAlpha(alpha);
invalidate();
}
/**
* Sets the coeff
of the {@link Paint} for drawing
* the selector spinnerwheel.
*
* @param coeff Coefficient from 0 (selector is passive) to 1 (selector is active)
*/
abstract public void setSelectorPaintCoeff(float coeff);
//--------------------------------------------------------------------------
//
// Processing scroller events
//
//--------------------------------------------------------------------------
@Override
protected void onScrollTouched() {
mDimSelectorWheelAnimator.cancel();
mDimSeparatorsAnimator.cancel();
setSelectorPaintCoeff(1);
setSeparatorsPaintAlpha(mSelectionDividerActiveAlpha);
}
@Override
protected void onScrollTouchedUp() {
super.onScrollTouchedUp();
fadeSelectorWheel(750);
lightSeparators(750);
}
@Override
protected void onScrollFinished() {
fadeSelectorWheel(500);
lightSeparators(500);
}
//----------------------------------
// Animating components
//----------------------------------
/**
* Fade the selector spinnerwheel via an animation.
*
* @param animationDuration The duration of the animation.
*/
private void fadeSelectorWheel(long animationDuration) {
mDimSelectorWheelAnimator.setDuration(animationDuration);
mDimSelectorWheelAnimator.start();
}
/**
* Fade the selector spinnerwheel via an animation.
*
* @param animationDuration The duration of the animation.
*/
private void lightSeparators(long animationDuration) {
mDimSeparatorsAnimator.setDuration(animationDuration);
mDimSeparatorsAnimator.start();
}
//--------------------------------------------------------------------------
//
// Layout measuring
//
//--------------------------------------------------------------------------
/**
* Perform layout measurements
*/
abstract protected void measureLayout();
//--------------------------------------------------------------------------
//
// Drawing stuff
//
//--------------------------------------------------------------------------
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mViewAdapter != null && mViewAdapter.getItemsCount() > 0) {
if (rebuildItems()) {
measureLayout();
}
doItemsLayout();
drawItems(canvas);
}
}
/**
* Draws items on specified canvas
*
* @param canvas the canvas for drawing
*/
abstract protected void drawItems(Canvas canvas);
}