TagCloudView雲標簽的靈活運用

来源:https://www.cnblogs.com/ganchuanpu/archive/2018/02/08/8432125.html
-Advertisement-
Play Games

這兩天做了一個項目,發現標簽不能更改任意一個標簽的字體的顏色,需求如同置前標簽,然後就對tagcloudeview稍做修改做了這麼一個demo。不為別的,只為以後自己用的時候方便拷貝。 先看效果圖: 這兩天做了一個項目,需求如同置前標簽,然後就對tagcloudeview稍做修改做了這麼一個demo ...


這兩天做了一個項目,發現標簽不能更改任意一個標簽的字體的顏色,需求如同置前標簽,然後就對tagcloudeview稍做修改做了這麼一個demo。不為別的,只為以後自己用的時候方便拷貝。

先看效果圖: 
示意圖 
這兩天做了一個項目,需求如同置前標簽,然後就對tagcloudeview稍做修改做了這麼一個demo。不為別的,只為以後自己用的時候方便拷貝。

雲標簽開源地址https://github.com/kingideayou/TagCloudView 
在源碼裡面加了兩個方法

 1 /**修改某些位置定點顏色**/
 2     public void setTagsByPosition(HashMap<Integer, Boolean> positions, List<String> tagList){
 3         this.tags = tagList;
 4         this.removeAllViews();
 5         if (tags != null && tags.size() > 0) {
 6             for (int i = 0; i < tags.size(); i++) {
 7                 TextView tagView = (TextView) mInflater.inflate(mTagResId, null);
 8                 if (mTagResId == DEFAULT_TAG_RESID) {
 9                     tagView.setBackgroundResource(mBackground);
10                     tagView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mTagSize);
11                     if (positions.get(i)){
12                         tagView.setTextColor(mSeclectTagColor);
13                     }else{
14                         tagView.setTextColor(mTagColor);
15                     }
16                 }
17                 LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
18                 tagView.setLayoutParams(layoutParams);
19                 tagView.setText(tags.get(i));
20                 tagView.setTag(TYPE_TEXT_NORMAL);
21                 final int finalI = i;
22                 tagView.setOnClickListener(new OnClickListener() {
23                     @Override
24                     public void onClick(View v) {
25                         if (onTagClickListener != null) {
26                             onTagClickListener.onTagClick(finalI);
27                         }
28                     }
29                 });
30                 addView(tagView);
31             }
32         }
33         postInvalidate();
34     }
35     /**最前面的修改顏色**/
36     public void setTagsByLength(int length,List<String> tagList){
37         this.tags = tagList;
38         this.removeAllViews();
39         if (tags != null && tags.size() > 0) {
40 
41             for (int i = 0; i < tags.size(); i++) {
42                 TextView tagView = (TextView) mInflater.inflate(mTagResId, null);
43                 if (mTagResId == DEFAULT_TAG_RESID) {
44                     tagView.setBackgroundResource(mBackground);
45                     tagView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mTagSize);
46                     if (i >= length){
47                         tagView.setTextColor(mTagColor);
48                     }else{
49                         tagView.setTextColor(mSeclectTagColor);
50                     }
51                 }
52                 LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
53                 tagView.setLayoutParams(layoutParams);
54                 tagView.setText(tags.get(i));
55                 tagView.setTag(TYPE_TEXT_NORMAL);
56                 final int finalI = i;
57                 tagView.setOnClickListener(new OnClickListener() {
58                     @Override
59                     public void onClick(View v) {
60                         if (onTagClickListener != null) {
61                             onTagClickListener.onTagClick(finalI);
62                         }
63                     }
64                 });
65                 addView(tagView);
66             }
67         }
68         postInvalidate();
69     }

一目瞭然的方法,所以不多做解釋 
另外加了一個選中字體顏色的全局常量,和一個int變數

 private static final int SELCECT_TEXT_COLOR = R.color.yellow_bg;//選中後的標簽顏色
    private int mSeclectTagColor;

在styles.xml中給TagCloudView增加了一個選中字體顏色的attr

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

剩下就是運用的地方

不多說,直接上代碼

  1 public class MainActivity extends AppCompatActivity {
  2     private TagCloudView normalTagView;//標準
  3     private TagCloudView selectTagUseView;//置前
  4     private TagCloudView positionsView;//定點
  5     private List<String> AllTagsNormal = new ArrayList<>(0);//整個標簽存放集合
  6     private List<String> AllTagsSelect = new ArrayList<>(0);//整個標簽存放集合
  7     private List<String> selectTags = new ArrayList<>(0);//選中的標簽
  8     private List<String> notSelectTags = new ArrayList<>(0);//未選中的標簽
  9 
 10     private List<String> AllTagsPosition = new ArrayList<>(0);//整個標簽存放集合
 11     private HashMap<Integer, Boolean> map = new HashMap<>(0);//記錄選擇的位置
 12 
 13     @Override
 14     protected void onCreate(Bundle savedInstanceState) {
 15         super.onCreate(savedInstanceState);
 16         setContentView(R.layout.activity_main);
 17         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
 18         normalTagView = (TagCloudView) findViewById(R.id.normalTag);
 19         selectTagUseView = (TagCloudView) findViewById(R.id.selcetTagUse);
 20         positionsView = (TagCloudView) findViewById(R.id.positionsTag);
 21         setSupportActionBar(toolbar);
 22         for (int i = 0; i < 15; i++) {
 23             AllTagsNormal.add("普通標簽" + i);
 24             AllTagsSelect.add("置前標簽" + i);
 25             AllTagsPosition.add("定點標簽" + i);
 26             map.put(i, false);
 27         }
 28         normalTagView.setOnTagClickListener(new TagCloudView.OnTagClickListener() {
 29             @Override
 30             public void onTagClick(int position) {
 31                 Snackbar.make(normalTagView, AllTagsNormal.get(position), Snackbar.LENGTH_LONG)
 32                         .setAction("Action", null).show();
 33             }
 34         });
 35         selectTagUseView.setOnTagClickListener(new TagCloudView.OnTagClickListener() {
 36             @Override
 37             public void onTagClick(int position) {
 38                 if (selectTags.contains(AllTagsSelect.get(position))) {//如果選中的裡面有 就刪掉 扔到未選中的裡面去
 39                     selectTags.remove(position);
 40                     notSelectTags.add(AllTagsSelect.get(position));
 41                 } else {
 42                     selectTags.add(AllTagsSelect.get(position));//
 43                     notSelectTags.remove(position - selectTags.size() + 1);
 44                 }
 45                 Snackbar.make(selectTagUseView, AllTagsSelect.get(position), Snackbar.LENGTH_LONG)
 46                         .setAction("Action", null).show();
 47 
 48                 AllTagsSelect.clear();//清空,重新裝數據
 49                 AllTagsSelect.addAll(selectTags);
 50                 AllTagsSelect.addAll(notSelectTags);
 51                 bindSelectUseView(selectTags.size());
 52 
 53             }
 54         });
 55         positionsView.setOnTagClickListener(new TagCloudView.OnTagClickListener() {
 56             @Override
 57             public void onTagClick(int position) {
 58                 bindPositionView(position);
 59                 Snackbar.make(positionsView, AllTagsPosition.get(position), Snackbar.LENGTH_LONG)
 60                         .setAction("Action", null).show();
 61             }
 62         });
 63         normalTagView.setTags(AllTagsNormal);
 64 
 65 
 66         int selectLength = 4;
 67         bindSelectUseView(selectLength);
 68 
 69 
 70         //用一個hashmap存放當前位置是否需要變色
 71         bindPositionView(3);
 72         bindPositionView(6);
 73         bindPositionView(9);
 74 
 75     }
 76 
 77     /**
 78      * 定點標簽記錄和view變化
 79      **/
 80     private void bindPositionView(int position) {
 81         for (int i = 0; i < AllTagsPosition.size(); i++) {
 82             if (i == position) {
 83                 if (map.get(i)) {
 84                     map.put(i, false);
 85                 } else {
 86                     map.put(i, true);
 87                 }
 88             } else {
 89                 if (map.get(i)) {
 90                     map.put(i, true);
 91                 } else {
 92                     map.put(i, false);
 93                 }
 94             }
 95         }
 96         positionsView.setTagsByPosition(map, AllTagsPosition);
 97         for (int i = 0; i < AllTagsPosition.size(); i++) {
 98             if (map.get(i)) {
 99                 positionsView.getChildAt(i).setBackgroundResource(R.drawable.edit_style_yellow);
100             }
101         }
102     }
103 
104     /**
105      * 選中標簽的運用
106      **/
107     private void bindSelectUseView(int selectLength) {
108         selectTagUseView.setTagsByLength(selectLength, AllTagsSelect);
109         selectTags.clear();
110         notSelectTags.clear();
111         for (int i = 0; i < AllTagsSelect.size(); i++) {
112             if (i < selectLength) {
113                 selectTags.add(AllTagsSelect.get(i));//選中的存放入集合
114                 selectTagUseView.getChildAt(i).setBackgroundResource(R.drawable.edit_style_yellow);
115             } else {
116                 notSelectTags.add(AllTagsSelect.get(i));//未選中的存放入集合
117             }
118         }
119     }
120 
121     @Override
122     public boolean onCreateOptionsMenu(Menu menu) {
123         // Inflate the menu; this adds items to the action bar if it is present.
124         getMenuInflater().inflate(R.menu.menu_main, menu);
125         return true;
126     }
127 
128     @Override
129     public boolean onOptionsItemSelected(MenuItem item) {
130         // Handle action bar item clicks here. The action bar will
131         // automatically handle clicks on the Home/Up button, so long
132         // as you specify a parent activity in AndroidManifest.xml.
133         int id = item.getItemId();
134 
135         //noinspection SimplifiableIfStatement
136         if (id == R.id.action_settings) {
137             return true;
138         }
139 
140         return super.onOptionsItemSelected(item);
141     }
142 }

項目下載地址:https://github.com/a12a15a05/TagCloudViewDemo


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、事務概述 1.什麼是事務 一件事情有n個組成單元 要不這n個組成單元同時成功 要不n個單元就同時失敗 就是將n個組成單元放到一個事務中 2.mysql的事務 預設的事務:一條sql語句就是一個事務 預設就開啟事務並提交事務 手動事務: 1)顯示的開啟一個事務:start transaction ...
  • 現象 最近一直收到客戶反饋某個報表數據查詢不出來。 處理過程 將涉及SQL挖出來後研究未發現sql有任何異常,且未找到優化空間,F5查看執行計劃發現耗費巨大,且兩表索引均未生效,但把兩表單獨拿出來查詢索引有效,所以初步認定為索引失效問題。 Oracle 索引的目標是避免全表掃描,提高查詢效率,但有些 ...
  • 分類與協議是Object-C特有概念,分類(Category)可以認為是一種繼承性的擴展,而協議(Protocol)可以理解為Java中的Interface(介面)或者C++的純虛類。 參考資料:《iPhone與iPad開發實戰-iOS經典應用剖析》 分類與協議是Object-C特有概念,分類(Ca ...
  • Android O 上Notification的新特性: 通知通道功能 1. 簡介: 通知通道功能使開發者管理自己應用的通知成為一個組或者一個通道,用戶可以通過通知通道完成設置通知,如:阻止所有通知,改變某個通道通知的優先順序,是不是顯示launch上的小圓點。通過這些方式來提升用戶體驗。 2. 1. ...
  • Github網址:https://github.com/Stars-One/CirclePointMove 這個開源庫一個封裝好的Viewpager指示器,之前在學習的時候,想要實現一個小圓點跟隨Viewpager移動的功能,在github上找了許久,發現大神們的指示器很強大,很逼格,同時,設置也是 ...
  • 尊重勞動成果,轉載請標明出處http://www.cnblogs.com/tangZH/p/8423803.html android滑動組件的scrollBar,看了不是很順眼,沒辦法,因為項目需求,得自定義一個。 1、自定義一個View,繼承HorizontalScrollView 2、根據需求自 ...
  • 創建Class 添加成員變數 獲取Class的成員變數名 調用以後,結果為: 創建方法 第一個參數為類名,第二個參數為方法名,第三個參數是函數名,第四個參數是函數的返回值和參數的類型,v表是void,@表示id,:表示SEL。更多多定義參考:SELECTOR 需要實現,這個方法 添加屬性 查看屬性 ...
  • 導入文件 在使用反射機制時用到反射屬性要導入文件: #import<objc/runtime.h> 否則會報錯: Declaration of 'objc_property_t' must be imported from module 'ObjectiveC.runtime' before it ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...