android 云标签,文字墙(文字随机排列效果)
来源:互联网 发布:mac共享设置 编辑:程序博客网 时间:2024/05/18 03:18
写个小demo分享一下,还望各位多多指正。
demo效果图如下:
主界面代码:
package com.example.huan.textwall;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import com.example.huan.textwall.model.TextItem;import com.example.huan.textwall.view.TextWall;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private TextWall textWall; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textWall = (TextWall) findViewById(R.id.tw_test); } @Override protected void onResume() { super.onResume(); } @Override protected void onStart() { super.onStart(); final String[] texts = {"聪明","活泼","可爱","善解人意","美丽","大方","帅气","稳重","乐观","多愁善感","果断勇敢"}; textWall.post(new Runnable(){ @Override public void run() { List<TextItem> textItems = new ArrayList<TextItem>(); for (int i = 0; i < 30; i++) { TextItem item = new TextItem(); item.setIndex(10); item.setValue(texts[i%10]); textItems.add(item); } textWall.setData(textItems, MainActivity.this); Log.d("aaaaa",textWall.getWidth()+"dp"); } }); }}
自定义FrameLayout:
package com.example.huan.textwall.view;import android.animation.ValueAnimator;import android.content.Context;import android.content.res.Resources;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.view.ViewTreeObserver;import android.view.animation.Animation;import android.view.animation.DecelerateInterpolator;import android.view.animation.Interpolator;import android.view.animation.ScaleAnimation;import android.widget.AbsoluteLayout;import android.widget.FrameLayout;import android.widget.TextView;import android.widget.Toast;import com.example.huan.textwall.R;import com.example.huan.textwall.model.TextItem;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Random;/** * Created by Squirrelhuan on 2017/7/21. */public class TextWall extends FrameLayout implements ViewTreeObserver.OnGlobalLayoutListener { private int[] colors = {R.color.red, R.color.orange, R.color.yellow, R.color.green, R.color.cyan, R.color.blue, R.color.purple}; private int width, height; Random random = new Random(); public TextWall(Context context) { super(context); } public TextWall(Context context, AttributeSet attrs) { super(context, attrs); } public TextWall(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private boolean isFirst = true; public void onGlobalLayout() { if (isFirst) { height = getHeight(); isFirst = false; } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); getViewTreeObserver().removeOnGlobalLayoutListener(this);//(API 16) } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); getViewTreeObserver().addOnGlobalLayoutListener(this); } private static int Animination_index; static ScaleAnimation animation = null; int count; public void setData(List<TextItem> items, final Context context) { count = items.size(); //1.优先级排序 items = sortTextItem(items); //2.字体大小排序 int[] frontSizes = generateFrontSize(items.size()); for (int i = 0; i < count; i++) { TextItem temp = items.get(i); temp.setFrontSize(frontSizes[i]); temp.setFrontColor(colors[random.nextInt(7)]); items.set(i, temp); } for (int i = count - 1; i >= 0; i--) { TextView textView = new TextView(context); textView.setText(items.get(i).getValue()); textView.setTextSize(items.get(i).getFrontSize()); textView.setTextColor(context.getResources().getColor(items.get(i).getFrontColor())); int b = random.nextInt(2); if (b == 1) { textView.setSingleLine(true); } else { textView.setEms(1); } textView.setGravity(View.TEXT_ALIGNMENT_CENTER); textView.setTag(items.get(i)); textView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context, ((TextItem) view.getTag()).getValue(), Toast.LENGTH_SHORT).show(); } }); addView(textView); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); FrameLayout.MarginLayoutParams marginParams = null; //获取view的margin设置参数 if (params instanceof ViewGroup.MarginLayoutParams) { marginParams = (ViewGroup.MarginLayoutParams) params; } else { //不存在时创建一个新的参数 //基于View本身原有的布局参数对象 marginParams = new ViewGroup.MarginLayoutParams(params); } //设置margin int height_px = getHeight(); int width_px = getWidth(); int left = random.nextInt(width_px); int top = random.nextInt(height_px); left = left > (width_px / 2) ? left - width_px / 10 - getCharacterWidth(items.get(i).getValue(), items.get(i).getFrontSize()) : left; top = top > (height_px / 2) ? top - height_px / 10 - ((b == 0) ? getCharacterWidth(items.get(i).getValue(), items.get(i).getFrontSize()) : items.get(i).getFrontSize()) : top; marginParams.setMargins(left, top, 0, 0); textView.setLayoutParams(marginParams); } TextView tv = null; for (int i = 0; i < count; i++) { tv = (TextView) getChildAt(i); animation = new ScaleAnimation(0.8f, 1.3f, 0.8f, 1.3f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { if (Animination_index + 1 == count) { Animination_index = 0; } else { Animination_index++; } doAnimination(); } @Override public void onAnimationRepeat(Animation animation) { } }); animation.setDuration(1300); animation.setInterpolator(new DecelerateInterpolator()); animation.setRepeatCount(0); /* tv.setAnimation(animation);*/ } getChildAt(0).startAnimation(animation); } void doAnimination() { if (Animination_index == 0 || getChildAt(count-1).getAnimation() != null) { getChildAt(count-1).setAnimation(null); } else { getChildAt(Animination_index - 1).setAnimation(null); } getChildAt(Animination_index).startAnimation(animation); } public static void setMargins(View v, int l, int t, int r, int b) { if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); p.setMargins(l, t, r, b); v.requestLayout(); } } private int[] generateFrontSize(int count) { int[] sizes = new int[count]; for (int i = 0; i < count; i++) { random = new Random(); sizes[i] = (random.nextInt(6) * 5 + 12); } for (int i = 0; i < count; i++) { for (int j = 0; j < count; j++) { if (sizes[i] > sizes[j]) { int c = sizes[i]; sizes[i] = sizes[j]; sizes[j] = c; } } } return sizes; } /** * 排序 */ List<TextItem> sortTextItem(List<TextItem> items) { int count = items.size(); for (int i = 0; i < count; i++) { for (int j = 0; j < count; j++) { if (items.get(i).getIndex() > items.get(j).getIndex()) { TextItem item_c = items.get(i); items.add(i, items.get(j)); items.add(j, item_c); } } } return items; } //Android获取当前文字的总体长度的方法 public int getCharacterWidth(String text, float size) { if (null == text || "".equals(text)) { return 0; } Paint paint = new Paint(); paint.setTextSize(size); int text_width = (int) paint.measureText(text);// 得到总体长度 // int width = text_width/text.length();//每一个字符的长度 return text_width; } public static int px2dip(Context mContext, float px) { float scale = mContext.getResources().getDisplayMetrics().density; return (int) (px / scale + 0.5f); } public static int dip2px(Context mContext, float dp) { float scale = mContext.getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); }}用来控制单个文字显示效果的model类:
package com.example.huan.textwall.model;/** * Created by squirrelhuan on 2017/7/21. *//** * 要显示的文字 */public class TextItem { private String value; private float index; private int frontSize; private int frontColor; public int getFrontColor() { return frontColor; } public void setFrontColor(int frontColor) { this.frontColor = frontColor; } public int getFrontSize() { return frontSize; } public void setFrontSize(int frontSize) { this.frontSize = frontSize; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public float getIndex() { return index; } public void setIndex(float index) { this.index = index; }}
最后大家也看到了存在的弊端或者说没有完善的地方还有好多,这里只是个人的思路,还有很多想法没去完善。个人能力有限,还望大家多多包涵。愿与大家共同学习成长,感谢各位。
源码地址:http://download.csdn.net/detail/u010257120/9907957
Github:https://github.com/squirrelhuan/TextWall
阅读全文
0 0
- android 云标签,文字墙(文字随机排列效果)
- android文字标签处理
- android文字阴影效果
- android文字阴影效果
- android文字阴影效果
- Android文字阴影效果
- android文字阴影效果
- android文字阴影效果
- android文字阴影效果
- Android 文字竖排效果
- android文字闪动效果
- Android文字环绕效果
- jq文字标签混排随机字体大小
- 第四篇:Android文字标签
- android文字阴影效果设置
- Android 文字跑马灯效果
- Android文字的阴影效果
- Android 文字跑马灯效果
- oracle 备份表,删除表 drop delete truncate
- 判断一个点是否在三角形内
- 十一、Spring Cloud包管理
- 分页组件简版
- java基本类型和基本类型包装型比较时的自动拆箱和自动装箱
- android 云标签,文字墙(文字随机排列效果)
- 数组<->指针<->动态数组之间的关系
- redis.clients.jedis.exceptions.JedisClusterException & [ERR] Node 192.168.10.32:7001 is not emp
- Java中System.setProperty()用法
- TCP/IP,HTTP,SOAP等协议之区别
- mongo查询谨记知识点
- freemarker-模板
- 测试道路之第三周
- 每日一题之求二叉树的高度并销毁一棵二叉树