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