天天看點

android實作标簽功能,Android應用開發之android LabelView實作标簽雲效果

本文将帶你了解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頻道!