这两天做了一个项目,发现标签不能更改任意一个标签的字体的颜色,需求如同置前标签,然后就对tagcloudeview稍做修改做了这么一个demo。不为别的,只为以后自己用的时候方便拷贝。

先看效果图: 
 
这两天做了一个项目,需求如同置前标签,然后就对tagcloudeview稍做修改做了这么一个demo。不为别的,只为以后自己用的时候方便拷贝。

云标签开源地址https://github.com/kingideayou/TagCloudView 
在源码里面加了两个方法

 /**修改某些位置定点颜色**/
public void setTagsByPosition(HashMap<Integer, Boolean> positions, List<String> tagList){
this.tags = tagList;
this.removeAllViews();
if (tags != null && tags.size() > ) {
for (int i = ; i < tags.size(); i++) {
TextView tagView = (TextView) mInflater.inflate(mTagResId, null);
if (mTagResId == DEFAULT_TAG_RESID) {
tagView.setBackgroundResource(mBackground);
tagView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mTagSize);
if (positions.get(i)){
tagView.setTextColor(mSeclectTagColor);
}else{
tagView.setTextColor(mTagColor);
}
}
LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
tagView.setLayoutParams(layoutParams);
tagView.setText(tags.get(i));
tagView.setTag(TYPE_TEXT_NORMAL);
final int finalI = i;
tagView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (onTagClickListener != null) {
onTagClickListener.onTagClick(finalI);
}
}
});
addView(tagView);
}
}
postInvalidate();
}
/**最前面的修改颜色**/
public void setTagsByLength(int length,List<String> tagList){
this.tags = tagList;
this.removeAllViews();
if (tags != null && tags.size() > ) { for (int i = ; i < tags.size(); i++) {
TextView tagView = (TextView) mInflater.inflate(mTagResId, null);
if (mTagResId == DEFAULT_TAG_RESID) {
tagView.setBackgroundResource(mBackground);
tagView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mTagSize);
if (i >= length){
tagView.setTextColor(mTagColor);
}else{
tagView.setTextColor(mSeclectTagColor);
}
}
LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
tagView.setLayoutParams(layoutParams);
tagView.setText(tags.get(i));
tagView.setTag(TYPE_TEXT_NORMAL);
final int finalI = i;
tagView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (onTagClickListener != null) {
onTagClickListener.onTagClick(finalI);
}
}
});
addView(tagView);
}
}
postInvalidate();
}

一目了然的方法,所以不多做解释 
另外加了一个选中字体颜色的全局常量,和一个int变量

 private static final int SELCECT_TEXT_COLOR = R.color.yellow_bg;//选中后的标签颜色
private int mSeclectTagColor;

在styles.xml中给TagCloudView增加了一个选中字体颜色的attr

  <attr name="tcvSeclecTextColor" format="reference" />

剩下就是运用的地方

不多说,直接上代码

 public class MainActivity extends AppCompatActivity {
private TagCloudView normalTagView;//标准
private TagCloudView selectTagUseView;//置前
private TagCloudView positionsView;//定点
private List<String> AllTagsNormal = new ArrayList<>();//整个标签存放集合
private List<String> AllTagsSelect = new ArrayList<>();//整个标签存放集合
private List<String> selectTags = new ArrayList<>();//选中的标签
private List<String> notSelectTags = new ArrayList<>();//未选中的标签 private List<String> AllTagsPosition = new ArrayList<>();//整个标签存放集合
private HashMap<Integer, Boolean> map = new HashMap<>();//记录选择的位置 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
normalTagView = (TagCloudView) findViewById(R.id.normalTag);
selectTagUseView = (TagCloudView) findViewById(R.id.selcetTagUse);
positionsView = (TagCloudView) findViewById(R.id.positionsTag);
setSupportActionBar(toolbar);
for (int i = ; i < ; i++) {
AllTagsNormal.add("普通标签" + i);
AllTagsSelect.add("置前标签" + i);
AllTagsPosition.add("定点标签" + i);
map.put(i, false);
}
normalTagView.setOnTagClickListener(new TagCloudView.OnTagClickListener() {
@Override
public void onTagClick(int position) {
Snackbar.make(normalTagView, AllTagsNormal.get(position), Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
selectTagUseView.setOnTagClickListener(new TagCloudView.OnTagClickListener() {
@Override
public void onTagClick(int position) {
if (selectTags.contains(AllTagsSelect.get(position))) {//如果选中的里面有 就删掉 扔到未选中的里面去
selectTags.remove(position);
notSelectTags.add(AllTagsSelect.get(position));
} else {
selectTags.add(AllTagsSelect.get(position));//
notSelectTags.remove(position - selectTags.size() + );
}
Snackbar.make(selectTagUseView, AllTagsSelect.get(position), Snackbar.LENGTH_LONG)
.setAction("Action", null).show(); AllTagsSelect.clear();//清空,重新装数据
AllTagsSelect.addAll(selectTags);
AllTagsSelect.addAll(notSelectTags);
bindSelectUseView(selectTags.size()); }
});
positionsView.setOnTagClickListener(new TagCloudView.OnTagClickListener() {
@Override
public void onTagClick(int position) {
bindPositionView(position);
Snackbar.make(positionsView, AllTagsPosition.get(position), Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
normalTagView.setTags(AllTagsNormal); int selectLength = ;
bindSelectUseView(selectLength); //用一个hashmap存放当前位置是否需要变色
bindPositionView();
bindPositionView();
bindPositionView(); } /**
* 定点标签记录和view变化
**/
private void bindPositionView(int position) {
for (int i = ; i < AllTagsPosition.size(); i++) {
if (i == position) {
if (map.get(i)) {
map.put(i, false);
} else {
map.put(i, true);
}
} else {
if (map.get(i)) {
map.put(i, true);
} else {
map.put(i, false);
}
}
}
positionsView.setTagsByPosition(map, AllTagsPosition);
for (int i = ; i < AllTagsPosition.size(); i++) {
if (map.get(i)) {
positionsView.getChildAt(i).setBackgroundResource(R.drawable.edit_style_yellow);
}
}
} /**
* 选中标签的运用
**/
private void bindSelectUseView(int selectLength) {
selectTagUseView.setTagsByLength(selectLength, AllTagsSelect);
selectTags.clear();
notSelectTags.clear();
for (int i = ; i < AllTagsSelect.size(); i++) {
if (i < selectLength) {
selectTags.add(AllTagsSelect.get(i));//选中的存放入集合
selectTagUseView.getChildAt(i).setBackgroundResource(R.drawable.edit_style_yellow);
} else {
notSelectTags.add(AllTagsSelect.get(i));//未选中的存放入集合
}
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
}
}

项目下载地址:https://github.com/a12a15a05/TagCloudViewDemo

TagCloudView云标签的灵活运用的更多相关文章

  1. Android 3d云标签

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWluZ3l1ZV8xMTI4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  2. Word云(标签云)生成器控件。net Windows。形式在c#中

    下载demo - 37.1 KB 下载source code - 48.7 KB 背景 这种控制方式的灵感来自于一种名为Wordle的基于网络的免费单词云生成器.实际上,这个控件是我的项目http:/ ...

  3. 非常漂亮js动态球型云标签特效代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" import="j ...

  4. 和阿文一起学H5-文字云制作

    ---恢复内容开始--- 实用工具!优秀的标签云免费生成工具 来源:http://www.uisdc.com/online-word-cloud-generators 标签云或文字云是关键词的视觉化描 ...

  5. AIROBOT系统 之 私人存储 和 DLNA 智能电视云

    需求背景 工作多年之后发现有太多的电子资料到处存放.个人电脑是Mac,硬盘都不大,放不了太多东西.并且有时候想随时随地存放一些东西.所有就有了大家一个私有存储的需求 个人休息在家经常喜欢看电影电视剧, ...

  6. matlab 三维激光雷达点云的地面与障碍物检测

    基于激光雷达的地面与障碍物检测 这个例子告诉我们如何去检测地平面并且找到三维LIDAR数据中与车相近的障碍物. 这个过程能够方便我们对汽车导航的可行驶区域规划. 注:每一帧的雷达属于都被存储为三维的雷 ...

  7. jQuery 动态标签生成插件

    前言: 最近对js的插件封装特别感兴趣,无耐就目前的技术想做到js的完全封装,还是有一定困难,就基于jQuery封装了一个小的插件,而且是基于对象级开发的,不是添加全局方法.高深的语法几乎没有,就有一 ...

  8. 你还在用a标签吗?——用button替代a

    前言:a标签,不止你在用,我也在用.但某些时候我们可以考虑用button替代a. 在多页应用中,a标签很常见,我们常用来作为一个普通超链接,进行页面跳转. 而在单页应用中,我们使用路由进行页面切换,a ...

  9. Android 开源项目分类汇总(转)

    Android 开源项目分类汇总(转) ## 第一部分 个性化控件(View)主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Galler ...

随机推荐

  1. (转)IBM AppScan 安全漏洞问题修复(.net)

    原文:https://www.cnblogs.com/anngeiBKY/p/4952269.html 按问题类型分类的问题 使用 SQL 注入的认证旁路2 已解密的登录请求3 登录错误消息凭证枚举1 ...

  2. 安装eclipse启动时报错

    1.在安装eclipse后,点击exe文件时,提示出现错误,记录在log文件中,因为log文件就是日志文件,可以方便我们排查错误,打开log文件,可以看到文件记录了每次出错的时间和错误栈信息,最新一次 ...

  3. 为 git 设置 http 代理

    最近基于 PDFium 项目做一些东西.之前得了代码,今天想要更新到最新的,发现怎么都 pull 不下来.后来想起来,可能是 git 没有使用代理的原因.于是添加代理,果然更新成功. 在 git ba ...

  4. hadoop2.7的目录结构

    1.$HADOOP_HOME/bin目录下文件及作用 文件名称 说明 hadoop 用于执行hadoop脚本命令,被hadoop-daemon.sh调用执行,也可以单独执行,一切命令的核心 2.$HA ...

  5. 使用Svn的版本号[转载]

    1. 生成一个名为autover的项目 注意项目的Properties文件夹下有一个名为AssemblyInfo.cs的文件,autover程序的版本号就写在它里面. 2. 创建模板文件 在Windo ...

  6. Apache版本的Hadoop HA集群启动详细步骤【包括Zookeeper、HDFS HA、YARN HA、HBase HA】(图文详解)

    不多说,直接上干货! 1.先每台机器的zookeeper启动(bigdata-pro01.kfk.com.bigdata-pro02.kfk.com.bigdata-pro03.kfk.com) 2. ...

  7. Gen对于数组Array的处理

    举个例子,如下: public void t() { String[][] a = new String[][] { { "x", "y" } }; Strin ...

  8. php -- 获取函数参数

    ----- 015-parameter.php ----- <!DOCTYPE html> <html> <head> <meta http-equiv=&q ...

  9. 07 - JavaSE之容器

    本章宗旨:1136 -- 1个图 1个类 3个知识点 6个接口 容器 J2SDK 所提供的容器 API 位于 java.util 包内. 容器 API 的类图如下: Collection 接口的子接口 ...

  10. 详解C#特性和反射(三)

    类型信息(Type Information)用来表示类型声明的信息,通过抽象基类System.Type的实例存储这些信息,当使用反射时,CLR获取指定类型的Type对象,通过这个对象即可访问该类型的任 ...