本文将帶你了解Android應用開發android LabelView實作标簽雲效果,希望本文對大家學Android有所幫助。
今天我們來做一個android上的标簽雲效果, 雖然還不是很完美,但是已經足夠可以展現标簽雲的效果了,首先來看看效果吧。
額,錄屏隻能錄到這個份上了,湊活着看吧。今天我們就來實作一下這個效果,
這次我選擇直接繼承view來, 什麼? 這樣的效果不是SurfaceView擅長的嗎? 為什麼要view,其實都可以了,
我選擇view,是因為:額,我對SurfaceView還不是很熟悉。
下面開始上代碼
public class LabelView extends View {
private static final int DIRECTION_LEFT = 0; // 向左
private static final int DIRECTION_RIGHT = 1; // 向右
private static final int DIRECITON_TOP = 2; // 向上
private static final int DIRECTION_BOTTOM = 3; // 向下
private boolean isStatic; // 是否靜止, 預設false, 可用幹xml : label:is_static="false"
private int[][] mLocations; // 每個label的位置 x/y
private int[][] mDirections; // 每個label的方向 x/y
private int[][] mSpeeds; // 每個label的x/y速度 x/y
private int[][] mTextWidthAndHeight; // 每個labeltext的大小 width/height
private String[] mLabels; // 設定的labels
private int[] mFontSizes; // 每個label的字型大小
// 預設配色方案
private int[] mColorSchema = {0XFFFF0000, 0XFF00FF00, 0XFF0000FF, 0XFFCCCCCC, 0XFFFFFFFF};
private int mTouchSlop; // 最小touch
private int mDownX = -1;
private int mDownY = -1;
private int mDownIndex = -1; // 點選的index
private Paint mPaint;
private Thread mThread;
private OnItemClickListener mListener; // item點選事件
public LabelView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LabelView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.LabelView, defStyleAttr, 0);
isStatic = ta.getBoolean(R.styleable.LabelView_is_static, false);
ta.recycle();
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
mPaint = new Paint();
mPaint.setAntiAlias(true);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
init();
}
@Override
protected void onDraw(Canvas canvas) {
if(!hasContents()) {
return;
}
for (int i = 0; i < mLabels.length; i++) {
mPaint.setTextSize(mFontSizes[i]);
if(i < mColorSchema.length) mPaint.setColor(mColorSchema[i]);
else mPaint.setColor(mColorSchema[i-mColorSchema.length]);
canvas.drawText(mLabels[i], mLocations[i][0], mLocations[i][1], mPaint);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = (int) ev.getX();
mDownY = (int) ev.getY();
mDownIndex = getClickIndex();
break;
case MotionEvent.ACTION_UP:
int nowX = (int) ev.getX();
int nowY = (int) ev.getY();
if (nowX - mDownX < mTouchSlop && nowY - mDownY < mTouchSlop
&& mDownIndex != -1 && mListener != null) {
mListener.onItemClick(mDownIndex, mLabels[mDownIndex]);
}
mDownX = mDownY = mDownIndex = -1;
break;
}
return true;
本文由職坐标整理并釋出,希望對同學們有所幫助。了解更多詳情請關注職坐标移動開發之Android頻道!