public class CycleCarouselTextView extends View {
private final String TAG = getClass().getSimpleName();
private Paint mPaint;
private float mStepDistance = 0;
private int mRate = 10;
private int index = 0;
private String[] mTextSrc;
private String[] mSkipUrl;
public static final String TEXT_K = "text_k", URL_K= "url_k";
private int mTextColorRes = android.R.color.black;
private float textSize = 50;
private long mIntervalTime = 6000; //轮播一次的时间,毫秒数, 默认6秒
private OnSkipListener callback;
private float yPoint;
private int viewWidth;
private String currentText;
private float mStep;
private float textL;
private Rect mRect;
private Handler reDrawHandler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
invalidate();
}
};
public void setIntervalTime(long intervalTime){
mIntervalTime = intervalTime;
}
public CycleCarouselTextView(Context context) {
super(context);
init();
}
private void init(){
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(SkinManager.getTheme().getColor(mTextColorRes));
mPaint.setTextSize(textSize);
mPaint.setTypeface(Typeface.DEFAULT);
mRect = new Rect();
}
public void setText(List<Map<String, String>> texts){
if(texts != null){
mTextSrc = new String[texts.size()];
mSkipUrl = new String[texts.size()];
for(int i=0; i<texts.size(); i++){
Map<String, String> map = texts.get(i);
if(map.containsKey(TEXT_K)){
mTextSrc[i] = map.get(TEXT_K);
if(map.containsKey(URL_K)){
mSkipUrl[i] = map.get(URL_K);
}else{
mSkipUrl[i] = "";
}
}
}
}
}
public void setTextColor(int textColor) {
mTextColorRes = textColor;
if(mPaint != null) mPaint.setColor(SkinManager.getTheme().getColor(mTextColorRes));
}
public void setTextSize(float textSize) {
this.textSize = textSize;
if(mPaint != null) mPaint.setTextSize(textSize);
}
public void setOnSkipListener(OnSkipListener callback) {
this.callback = callback;
}
public void setmRate(int mRate) {
this.mRate = mRate;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(mTextSrc == null || mTextSrc.length == 0) return;
if(!TextUtils.equals(mTextSrc[index], currentText)){
currentText = mTextSrc[index];
mPaint.getTextBounds(currentText, 0, currentText.length(), mRect);
textL = mRect.width();//文字宽
mStep = (2 * textL + viewWidth) / (mIntervalTime / (float)mRate);
}
canvas.drawText(currentText, viewWidth - mStepDistance, yPoint, mPaint);
mStepDistance += mStep;
if(mStepDistance > textL+viewWidth){
mStepDistance = 0;
if(++index > mTextSrc.length-1){
index = 0;
}
}
reDrawHandler.sendEmptyMessageDelayed(0, mRate);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP){
if(this.callback != null){
if(mSkipUrl != null &&index < mSkipUrl.length){
this.callback.onSkip(mSkipUrl[index]);
}
}
}
return true;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Paint.FontMetrics metrics = mPaint.getFontMetrics();
float dy = -(metrics.descent + metrics.ascent) / 2;
yPoint = getMeasuredHeight() / 2 + dy;
viewWidth = getMeasuredWidth()-getPaddingLeft() - getPaddingRight();
}
public interface OnSkipListener {
void onSkip(String url);
}
}
网友评论