亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS仿微信添加標簽效果(shape實現)

2020-07-26 03:05:31
字體:
來源:轉載
供稿:網友

一、 概述

可以說微信做的用戶體驗太棒了,可以做到老少皆宜,給個贊,我們也同時應該告誡自己,用戶體驗應該向微信看齊,微信就是我們的標桿,那我們今天也來仿一仿微信添加的標簽功能。只能仿著做了,真是做不到微信的那種體驗。甘拜下風。

我們上篇學習了shape屬性的用法,那我們今天就用shape來做下微信的標簽功能。先看一下效果。

我不僅用到了shape屬性,還用到了翔哥的標簽布局FlowLayout跟TagFlowLayout鴻洋的博客

二、效果圖

這里寫圖片描述

三 、定義shape

添加標簽

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle" ><cornersandroid:bottomLeftRadius="30dp"android:bottomRightRadius="30dp"android:topLeftRadius="30dp"android:topRightRadius="30dp" /><stroke android:dashWidth="5dp" android:dashGap="2dp" android:width="1dp" android:color="#e0e0e0" /><paddingandroid:bottom="2dp"android:left="10dp"android:right="10dp"android:top="2dp" /></shape>

刪除標簽

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><cornersandroid:bottomLeftRadius="30dp"android:bottomRightRadius="30dp"android:topLeftRadius="30dp"android:topRightRadius="30dp" /><solid android:color="#00FF00" /><paddingandroid:bottom="2dp"android:left="10dp"android:right="10dp"android:top="2dp" /></shape>

正常標簽

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle" ><cornersandroid:bottomLeftRadius="30dp"android:bottomRightRadius="30dp"android:topLeftRadius="30dp"android:topRightRadius="30dp" /><stroke android:width="1dp" android:color="#00FF00" /><paddingandroid:bottom="2dp"android:left="10dp"android:right="10dp"android:top="2dp" /></shape>

標簽選中

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><cornersandroid:bottomLeftRadius="30dp"android:bottomRightRadius="30dp"android:topLeftRadius="30dp"android:topRightRadius="30dp" /><strokeandroid:width="1dp"android:color="#00FF00" /><paddingandroid:bottom="2dp"android:left="10dp"android:right="10dp"android:top="2dp" /></shape>

以上是部分shape定義,大家可以下載源碼自己看。

四、 思路

我們可以標簽大概有以下邏輯

點擊上面標簽刪除 所有標簽里面更新未選中

點擊所有標簽的某一個 上面標簽添加或者刪除

五、代碼

public class MainActivity extends AppCompatActivity {private FlowLayout flowLayout;//上面的flowLayoutprivate TagFlowLayout allFlowLayout;//所有標簽的TagFlowLayoutprivate List<String> label_list = new ArrayList<>();//上面的標簽列表private List<String> all_label_List = new ArrayList<>();//所有標簽列表final List<TextView> labels = new ArrayList<>();//存放標簽final List<Boolean> labelStates = new ArrayList<>();//存放標簽狀態final Set<Integer> set = new HashSet<>();//存放選中的private TagAdapter<String> tagAdapter;//標簽適配器private LinearLayout.LayoutParams params;private EditText editText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();initEdittext();initAllLeblLayout();}/*** 初始化View*/private void initView() {flowLayout = (FlowLayout) findViewById(R.id.id_flowlayout);allFlowLayout = (TagFlowLayout) findViewById(R.id.id_flowlayout_two);params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);params.setMargins(20, 20, 20, 20);flowLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String editTextContent = editText.getText().toString();if (TextUtils.isEmpty(editTextContent)) {tagNormal();} else {addLabel(editText);}}});}/*** 初始化數據*/private void initData(){//初始化上面標簽label_list.add("同事");label_list.add("親人");label_list.add("同學");label_list.add("朋友");label_list.add("知己");//初始化下面標簽列表all_label_List.addAll(label_list);all_label_List.add("異性朋友");all_label_List.add("高中同學");all_label_List.add("大學同學");all_label_List.add("社會朋友");for (int i = 0; i < label_list.size() ; i++) {editText = new EditText(getApplicationContext());//new 一個EditTexteditText.setText(label_list.get(i));addLabel(editText);//添加標簽}}/*** 初始化默認的添加標簽*/private void initEdittext(){editText = new EditText(getApplicationContext());editText.setHint("添加標簽");//設置固定寬度editText.setMinEms(4);editText.setTextSize(12);//設置shapeeditText.setBackgroundResource(R.drawable.label_add);editText.setHintTextColor(Color.parseColor("#b4b4b4"));editText.setTextColor(Color.parseColor("#000000"));editText.setLayoutParams(params);//添加到layout中flowLayout.addView(editText);editText.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {tagNormal();}@Overridepublic void afterTextChanged(Editable s) {}});}/*** 初始化所有標簽列表*/private void initAllLeblLayout() {//初始化適配器tagAdapter = new TagAdapter<String>(all_label_List) {@Overridepublic View getView(FlowLayout parent, int position, String s) {TextView tv = (TextView) getLayoutInflater().inflate(R.layout.flag_adapter,allFlowLayout, false);tv.setText(s);return tv;}};allFlowLayout.setAdapter(tagAdapter);//根據上面標簽來判斷下面的標簽是否含有上面的標簽for (int i = 0; i < label_list.size(); i++) {for (int j = 0; j < all_label_List.size(); j++) {if (label_list.get(i).equals(all_label_List.get(j))) {tagAdapter.setSelectedList(i);//設為選中}}}tagAdapter.notifyDataChanged();//給下面的標簽添加監聽allFlowLayout.setOnTagClickListener(new TagFlowLayout.OnTagClickListener() {@Overridepublic boolean onTagClick(View view, int position, FlowLayout parent) {if (labels.size() == 0) {editText.setText(all_label_List.get(position));addLabel(editText);return false;}List<String> list = new ArrayList<>();for (int i = 0; i < labels.size(); i++) {list.add(labels.get(i).getText().toString());}//如果上面包含點擊的標簽就刪除if (list.contains(all_label_List.get(position))) {for (int i = 0; i < list.size(); i++) {if (all_label_List.get(position).equals(list.get(i))) {flowLayout.removeView(labels.get(i));labels.remove(i);}}} else {editText.setText(all_label_List.get(position));addLabel(editText);}return false;}});//已經選中的監聽allFlowLayout.setOnSelectListener(new TagFlowLayout.OnSelectListener() {@Overridepublic void onSelected(Set<Integer> selectPosSet) {set.clear();set.addAll(selectPosSet);}});}/*** 添加標簽* @param editText* @return*/private boolean addLabel(EditText editText) {String editTextContent = editText.getText().toString();//判斷輸入是否為空if (editTextContent.equals(""))return true;//判斷是否重復for (TextView tag : labels) {String tempStr = tag.getText().toString();if (tempStr.equals(editTextContent)) {editText.setText("");editText.requestFocus();return true;}}//添加標簽final TextView temp = getTag(editText.getText().toString());labels.add(temp);labelStates.add(false);//添加點擊事件,點擊變成選中狀態,選中狀態下被點擊則刪除temp.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int curIndex = labels.indexOf(temp);if (!labelStates.get(curIndex)) {//顯示 ×號刪除temp.setText(temp.getText() + " ×");temp.setBackgroundResource(R.drawable.label_del);temp.setTextColor(Color.parseColor("#ffffff"));//修改選中狀態labelStates.set(curIndex, true);} else {delByTest(temp.getText().toString());flowLayout.removeView(temp);labels.remove(curIndex);labelStates.remove(curIndex);for (int i = 0; i < label_list.size(); i++) {for (int j = 0; j < labels.size(); j++) {if (label_list.get(i).equals(labels.get(j).getText())) {tagAdapter.setSelectedList(i);}}}tagAdapter.notifyDataChanged();}}});flowLayout.addView(temp);//讓輸入框在最后一個位置上editText.bringToFront();//清空編輯框editText.setText("");editText.requestFocus();return true;}/*** 根據字符刪除標簽* @param text*/private void delByTest(String text) {for (int i = 0; i < all_label_List.size(); i++) {String a = all_label_List.get(i) + " ×";if (a.equals(text)) {set.remove(i);}}tagAdapter.setSelectedList(set);//重置選中的標簽}/*** 標簽恢復到正常狀態*/private void tagNormal() {//輸入文字時取消已經選中的標簽for (int i = 0; i < labelStates.size(); i++) {if (labelStates.get(i)) {TextView tmp = labels.get(i);tmp.setText(tmp.getText().toString().replace(" ×", ""));labelStates.set(i, false);tmp.setBackgroundResource(R.drawable.label_normal);tmp.setTextColor(Color.parseColor("#00FF00"));}}}/*** 創建一個正常狀態的標簽* @param label* @return*/private TextView getTag(String label) {TextView textView = new TextView(getApplicationContext());textView.setTextSize(12);textView.setBackgroundResource(R.drawable.label_normal);textView.setTextColor(Color.parseColor("#00FF00"));textView.setText(label);textView.setLayoutParams(params);return textView;}}

注釋的很詳細了。其實正常一步步來就按照邏輯來就可以實現,別慌,別亂,別急躁。什么功能都能實現的。

六、源碼

點擊下載

以上所述是小編給大家介紹的iOS仿微信添加標簽效果(shape實現),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久久免费精品| 98午夜经典影视| 欧美日韩亚洲视频| 亚洲欧美日韩久久久久久| 亚洲成年人在线| 亚洲精品自拍第一页| 欧美有码在线视频| 色偷偷av亚洲男人的天堂| 色综合亚洲精品激情狠狠| 国内精品久久久久久影视8| 伊人久久久久久久久久久| 欧美视频精品一区| 欧美精品在线视频观看| 国产亚洲xxx| 最新国产精品亚洲| 亚洲第一精品夜夜躁人人爽| 欧美三级欧美成人高清www| 欧美激情aaaa| 亚洲欧美999| 最新亚洲国产精品| 久久久精品免费视频| 亚洲天堂开心观看| 欧美在线视频a| 亚洲男人的天堂在线| 在线观看视频99| 中文欧美在线视频| 色一情一乱一区二区| 亚洲欧美福利视频| 国产精品一区二区久久精品| 久久久精品久久| 久久国产精品久久久久| 91美女高潮出水| 最好看的2019年中文视频| 国产精品永久免费观看| 久久久精品日本| 久久这里只有精品视频首页| 精品国产91久久久久久| 精品女同一区二区三区在线播放| 亚洲偷欧美偷国内偷| 国产精品免费视频久久久| 98精品国产自产在线观看| 国产一区二区三区在线视频| 亚洲欧洲美洲在线综合| 亚洲欧美日韩区| 亚洲精品资源美女情侣酒店| 久久夜色精品国产| 伦伦影院午夜日韩欧美限制| 国产亚洲欧美日韩精品| 欧美成人免费va影院高清| 欧洲永久精品大片ww免费漫画| 国产精品网站大全| 精品久久久久久久久国产字幕| 亚洲福利视频在线| 宅男66日本亚洲欧美视频| 亚洲欧美精品一区| 精品国产一区av| 亚洲一区二区久久久久久久| 成人欧美一区二区三区黑人| 亚洲国产精彩中文乱码av| 成人激情免费在线| 精品国产老师黑色丝袜高跟鞋| 欧美日韩另类字幕中文| 亚洲欧美精品中文字幕在线| 欧美怡春院一区二区三区| 97人人爽人人喊人人模波多| 亚洲男人的天堂在线| 欧美大片在线免费观看| 欧美激情手机在线视频| 亚洲视频电影图片偷拍一区| 欧美性jizz18性欧美| 精品亚洲夜色av98在线观看| 日韩在线播放一区| 欧美成人国产va精品日本一级| 欧美另类69精品久久久久9999| 97精品一区二区视频在线观看| 日韩av电影在线播放| 国产999视频| 国产精品视频午夜| 欧美视频在线观看免费网址| 中文字幕在线观看日韩| 亚洲国产私拍精品国模在线观看| 欧美激情第6页| 亚洲一区二区三区视频播放| 成人精品网站在线观看| 伊人亚洲福利一区二区三区| 亚洲欧美日韩久久久久久| 中文字幕成人在线| 欧美疯狂做受xxxx高潮| 少妇精69xxtheporn| 中文字幕在线精品| 国产在线视频2019最新视频| 亚洲xxxx视频| 亚洲精品一区中文字幕乱码| 国产成人精品免高潮费视频| 精品国产一区二区三区久久狼5月| 国产日韩一区在线| 久热精品视频在线免费观看| 欧美成年人在线观看| 成人亚洲欧美一区二区三区| 国产suv精品一区二区| 深夜精品寂寞黄网站在线观看| 欧美性高潮床叫视频| 国产精品日韩欧美综合| www.亚洲免费视频| 久久综合伊人77777蜜臀| 色妞在线综合亚洲欧美| 精品露脸国产偷人在视频| 668精品在线视频| 97超级碰碰碰| 国产成人+综合亚洲+天堂| 91免费在线视频网站| 国产精品第3页| 亚洲国产精彩中文乱码av在线播放| 亚洲最大激情中文字幕| 91视频-88av| 欧美一区二区三区四区在线| 国产一区二区在线免费| 精品久久久久久久久国产字幕| 亚洲高清免费观看高清完整版| 国产精品视频精品| 亚洲黄色av女优在线观看| 高清欧美性猛交xxxx| 国产精品久久视频| 欧美精品一区二区免费| 日韩欧美第一页| 欧美性xxxx极品hd满灌| 欧美精品福利在线| 久久av在线看| 欧美精品在线观看91| 国产精品久久97| 亚洲欧美日韩中文在线制服| 51色欧美片视频在线观看| 亚洲性视频网站| 成人精品一区二区三区电影免费| 国内免费精品永久在线视频| 欧美香蕉大胸在线视频观看| 中文字幕日韩欧美| 日韩动漫免费观看电视剧高清| 亚洲理论在线a中文字幕| 午夜精品久久久久久久99热| 亚洲精品网站在线播放gif| 黄色一区二区在线观看| 久久久亚洲福利精品午夜| 国产热re99久久6国产精品| 国产高清在线不卡| 久久精品久久精品亚洲人| 91精品国产91| 国产精品久久久久久久久久新婚| 2019av中文字幕| 欧美性高跟鞋xxxxhd| 亚洲精品一区av在线播放| 欧美亚洲日本黄色| 最新69国产成人精品视频免费| 久久国产一区二区三区| 欧美老女人性视频| 亚洲精品一区二三区不卡| 日韩av日韩在线观看| 亚洲成av人片在线观看香蕉| 亚洲高清久久网| 91在线网站视频| 欧美多人乱p欧美4p久久| 欧美在线观看网址综合| 自拍偷拍亚洲一区| 在线播放国产精品|