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频道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值