package com.astuetz.viewpager.extensions; |
import android.content.Context; |
import android.content.res.TypedArray; |
import android.graphics.Canvas; |
import android.graphics.Color; |
import android.graphics.Paint; |
import android.os.AsyncTask; |
import android.support.v4.view.ViewPager; |
import android.support.v4.view.ViewPager.OnPageChangeListener; |
import android.util.AttributeSet; |
import android.view.View; |
public class IndicatorLineView extends View implements OnPageChangeListener { |
|
@SuppressWarnings ( "unused" ) |
private static final String TAG = "com.astuetz.viewpager.extensions" ; |
|
private ViewPager mPager; |
|
private int mLineColor = 0xFF34B5E8 ; |
|
private float mLineLeft = 0 .0f; |
private float mLineWidth = 0 .0f; |
|
private int mFadeOutTime = 500 ; |
private int mFadingDuration = 200 ; |
|
private int mAlpha = 0xFF ; |
|
private FadeTimer mTimer; |
|
|
public IndicatorLineView(Context context) { |
this (context, null ); |
} |
|
public IndicatorLineView(Context context, AttributeSet attrs) { |
this (context, attrs, 0 ); |
} |
|
public IndicatorLineView(Context context, AttributeSet attrs, int defStyle) { |
super (context, attrs, defStyle); |
|
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ViewPagerExtensions, defStyle, 0 ); |
|
mLineColor = a.getColor(R.styleable.ViewPagerExtensions_lineColor, mLineColor); |
|
mFadeOutTime = a.getInt(R.styleable.ViewPagerExtensions_fadeOutDelay, mFadeOutTime); |
|
mFadingDuration = a.getInt(R.styleable.ViewPagerExtensions_fadeOutDuration, mFadingDuration); |
|
a.recycle(); |
} |
|
@Override |
protected void onSizeChanged( int w, int h, int oldw, int oldh) { |
if (mPager != null ) { |
mLineWidth = w / mPager.getAdapter().getCount(); |
mLineLeft = mLineWidth * mPager.getCurrentItem(); |
invalidate(); |
resetTimer(); |
} |
} |
|
|
|
public void setViewPager(ViewPager pager) { |
this .mPager = pager; |
mPager.setOnPageChangeListener( this ); |
} |
|
|
private Paint mLinePaint = new Paint(); |
|
protected synchronized void onDraw(Canvas canvas) { |
|
super .onDraw(canvas); |
|
final Paint linePaint = mLinePaint; |
|
final int color = Color.argb(mAlpha, Color.red(mLineColor), Color.green(mLineColor), Color.blue(mLineColor)); |
|
linePaint.setColor(color); |
|
// draw the line |
canvas.drawRect(mLineLeft, 0 , mLineLeft + mLineWidth, getMeasuredHeight(), linePaint); |
|
} |
|
|
|
public void onPageScrollStateChanged( int state) {} |
|
public void onPageScrolled( int position, float positionOffset, int positionOffsetPixels) { |
|
final float currentX = mPager.getScrollX(); |
final float fullX = (mPager.getWidth() + mPager.getPageMargin()) * (mPager.getAdapter().getCount()); |
|
mLineLeft = getMeasuredWidth() * currentX / fullX; |
|
mLineWidth = getMeasuredWidth() / mPager.getAdapter().getCount(); |
|
resetTimer(); |
|
invalidate(); |
|
} |
|
public void onPageSelected( int position) {} |
|
|
|
public void setLineColor( int lineColor) { |
this .mLineColor = lineColor; |
invalidate(); |
} |
|
public int getLineColor() { |
return this .mLineColor; |
} |
|
public void setFadeOutDelay( int milliseconds) { |
this .mFadeOutTime = milliseconds; |
invalidate(); |
} |
|
public int getFadeOutDelay() { |
return this .mFadeOutTime; |
} |
|
public void setFadeOutDuration( int milliseconds) { |
this .mFadingDuration = milliseconds; |
invalidate(); |
} |
|
public int getFadeOutDuration() { |
return this .mFadingDuration; |
} |
|
|
|
private void setAlpha( int alpha) { |
this .mAlpha = alpha; |
invalidate(); |
} |
|
private void resetTimer() { |
|
if (mFadeOutTime > 0 ) { |
|
if (mTimer == null || mTimer.isRunning == false ) { |
mTimer = new FadeTimer(); |
mTimer.execute(); |
} else { |
mTimer.reset(); |
} |
|
mAlpha = 0xFF ; |
|
} |
|
} |
|
private class FadeTimer extends AsyncTask<Void, Integer, Void> { |
|
private int elapsed = 0 ; |
private boolean isRunning = true ; |
|
public void reset() { |
elapsed = 0 ; |
} |
|
@Override |
protected Void doInBackground(Void... args) { |
while (isRunning) { |
try { |
Thread.sleep( 1 ); |
elapsed++; |
|
if (elapsed >= mFadeOutTime && elapsed < mFadeOutTime + mFadingDuration) { |
|
int x0 = mFadeOutTime; |
int x1 = mFadeOutTime + mFadingDuration; |
int x = elapsed; |
int y0 = 0xFF ; |
int y1 = 0x00 ; |
|
int a = y0 + ((x - x0) * y1 - (x - x0) * y0) / (x1 - x0); |
publishProgress(a); |
} |
else if (elapsed >= mFadeOutTime + mFadingDuration) { |
isRunning = false ; |
} |
|
} catch (InterruptedException e) { |
e.printStackTrace(); |
} |
} |
return null ; |
} |
|
protected void onProgressUpdate(Integer... alpha) { |
setAlpha(alpha[ 0 ]); |
} |
|
@Override |
protected void onPostExecute(Void result) { |
setAlpha( 0x00 ); |
} |
} |
|
} |
初级程序员
by: 云代码会员 发表于:2016-10-15 07:52:17 顶(0) | 踩(0) 回复
頂
回复评论