android 标签云的实现 关于x轴 冒泡排序~瞬间让你高达上

直接贴代码不解释

package com.js.cloudtags;

import java.util.LinkedList;
import java.util.Random;
import java.util.Vector;

import android.content.Context;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.FrameLayout;
import android.widget.TextView;

public class KeywordsFlow extends FrameLayout implements OnGlobalLayoutListener {

	public static final int IDX_X = 0;
    public static final int IDX_Y = 1;
    public static final int IDX_TXT_LENGTH = 2;
    public static final int IDX_DIS_Y = 3;
    /** 由外至内的动画。 */
    public static final int ANIMATION_IN = 1;
    /** 由内至外的动画。 */
    public static final int ANIMATION_OUT = 2;
    /** 位移动画类型:从外围移动到坐标点。 */
    public static final int OUTSIDE_TO_LOCATION = 1;
    /** 位移动画类型:从坐标点移动到外围。 */
    public static final int LOCATION_TO_OUTSIDE = 2;
    /** 位移动画类型:从中心点移动到坐标点。 */
    public static final int CENTER_TO_LOCATION = 3;
    /** 位移动画类型:从坐标点移动到中心点。 */
    public static final int LOCATION_TO_CENTER = 4;
    public static final long ANIM_DURATION = 800l;
    public static final int MAX = 10;
    public static final int TEXT_SIZE_MAX = 25;
    public static final int TEXT_SIZE_MIN = 15;
    private OnClickListener itemClickListener;
    private static Interpolator interpolator;
    private static AlphaAnimation animAlpha2Opaque;
    private static AlphaAnimation animAlpha2Transparent;
    private static ScaleAnimation animScaleLarge2Normal, animScaleNormal2Large, animScaleZero2Normal,
            animScaleNormal2Zero;
    /** 存储显示的关键字。 */
    private Vector<String> vecKeywords;
    private int width, height;
    /**
     * go2Show()中被赋值为true,标识开发人员触发其开始动画显示。<br/>
     * 本标识的作用是防止在填充keywrods未完成的过程中获取到width和height后提前启动动画。<br/>
     * 在show()方法中其被赋值为false。<br/>
     * 真正能够动画显示的另一必要条件:width 和 height不为0。<br/>
     */
    private boolean enableShow;
    private Random random;  

    /**
     * @see ANIMATION_IN
     * @see ANIMATION_OUT
     * @see OUTSIDE_TO_LOCATION
     * @see LOCATION_TO_OUTSIDE
     * @see LOCATION_TO_CENTER
     * @see CENTER_TO_LOCATION
     * */
    private int txtAnimInType, txtAnimOutType;
    /** 最近一次启动动画显示的时间。 */
    private long lastStartAnimationTime;
    /** 动画运行时间。 */
    private long animDuration; 

    public KeywordsFlow(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		init();
	}

    public KeywordsFlow(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		init();
	}

    public KeywordsFlow(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
		init();
	}

    private void init() {
        lastStartAnimationTime = 0l;
        animDuration = ANIM_DURATION;
        random = new Random();
        vecKeywords = new Vector<String>(MAX);
        getViewTreeObserver().addOnGlobalLayoutListener(this);
        interpolator = AnimationUtils.loadInterpolator(getContext(), android.R.anim.decelerate_interpolator);
        animAlpha2Opaque = new AlphaAnimation(0.0f, 1.0f);
        animAlpha2Transparent = new AlphaAnimation(1.0f, 0.0f);
        animScaleLarge2Normal = new ScaleAnimation(2, 1, 2, 1);
        animScaleNormal2Large = new ScaleAnimation(1, 2, 1, 2);
        animScaleZero2Normal = new ScaleAnimation(0, 1, 0, 1);
        animScaleNormal2Zero = new ScaleAnimation(1, 0, 1, 0);
    }  

    public long getDuration() {
        return animDuration;
    }  

    public void setDuration(long duration) {
        animDuration = duration;
    }  

    public boolean feedKeyword(String keyword) {
        boolean result = false;
        if (vecKeywords.size() < MAX) {
            result = vecKeywords.add(keyword);
        }
        return result;
    }  

    /**
     * 开始动画显示。<br/>
     * 之前已经存在的TextView将会显示退出动画。<br/>
     *
     * @return 正常显示动画返回true;反之为false。返回false原因如下:<br/>
     *         1.时间上不允许,受lastStartAnimationTime的制约;<br/>
     *         2.未获取到width和height的值。<br/>
     */
    public boolean go2Show(int animType) {
        if (System.currentTimeMillis() - lastStartAnimationTime > animDuration) {
            enableShow = true;
            if (animType == ANIMATION_IN) {
                txtAnimInType = OUTSIDE_TO_LOCATION;
                txtAnimOutType = LOCATION_TO_CENTER;
            } else if (animType == ANIMATION_OUT) {
                txtAnimInType = CENTER_TO_LOCATION;
                txtAnimOutType = LOCATION_TO_OUTSIDE;
            }
            disapper();
            boolean result = show();
            return result;
        }
        return false;
    }  

    private void disapper() {
        int size = getChildCount();
        for (int i = size - 1; i >= 0; i--) {
            final TextView txt = (TextView) getChildAt(i);
            if (txt.getVisibility() == View.GONE) {
                removeView(txt);
                continue;
            }
            FrameLayout.LayoutParams layParams = (LayoutParams) txt.getLayoutParams();
            // Log.d("ANDROID_LAB", txt.getText() + " leftM=" +
            // layParams.leftMargin + " topM=" + layParams.topMargin
            // + " width=" + txt.getWidth());
            int[] xy = new int[] { layParams.leftMargin, layParams.topMargin, txt.getWidth() };
            AnimationSet animSet = getAnimationSet(xy, (width >> 1), (height >> 1), txtAnimOutType);
            txt.startAnimation(animSet);
            animSet.setAnimationListener(new AnimationListener() {
                public void onAnimationStart(Animation animation) {
                }  

                public void onAnimationRepeat(Animation animation) {
                }  

                public void onAnimationEnd(Animation animation) {
                    txt.setOnClickListener(null);
                    txt.setClickable(false);
                    txt.setVisibility(View.GONE);
                }
            });
        }
    }  

    private boolean show() {
        if (width > 0 && height > 0 && vecKeywords != null && vecKeywords.size() > 0 && enableShow) {
            enableShow = false;
            lastStartAnimationTime = System.currentTimeMillis();
            int xCenter = width >> 1, yCenter = height >> 1;
            int size = vecKeywords.size();
            int xItem = width / size, yItem = height / size;
            // Log.d("ANDROID_LAB", "--------------------------width=" + width +
            // " height=" + height + "  xItem=" + xItem
            // + " yItem=" + yItem + "---------------------------");
            LinkedList<Integer> listX = new LinkedList<Integer>(), listY = new LinkedList<Integer>();
            for (int i = 0; i < size; i++) {
                // 准备随机候选数,分别对应x/y轴位置
                listX.add(i * xItem);
                listY.add(i * yItem + (yItem >> 2));
            }
            // TextView[] txtArr = new TextView[size];
            LinkedList<TextView> listTxtTop = new LinkedList<TextView>();
            LinkedList<TextView> listTxtBottom = new LinkedList<TextView>();
            for (int i = 0; i < size; i++) {
                String keyword = vecKeywords.get(i);
                // 随机颜色
                int ranColor = 0xff000000 | random.nextInt(0x0077ffff);
                // 随机位置,糙值
                int xy[] = randomXY(random, listX, listY, xItem);
                // 随机字体大小
                int txtSize = TEXT_SIZE_MIN + random.nextInt(TEXT_SIZE_MAX - TEXT_SIZE_MIN + 1);
                // 实例化TextView
                final TextView txt = new TextView(getContext());
                txt.setOnClickListener(itemClickListener);
                txt.setText(keyword);
                txt.setTextColor(ranColor);
                txt.setTextSize(TypedValue.COMPLEX_UNIT_SP, txtSize);
                txt.setShadowLayer(2, 2, 2, 0xff696969);
                txt.setGravity(Gravity.CENTER);
                // 获取文本长度
                Paint paint = txt.getPaint();
                int strWidth = (int) Math.ceil(paint.measureText(keyword));
                xy[IDX_TXT_LENGTH] = strWidth;
                // 第一次修正:修正x坐标
                if (xy[IDX_X] + strWidth > width - (xItem >> 1)) {
                    int baseX = width - strWidth;
                    // 减少文本右边缘一样的概率
                    xy[IDX_X] = baseX - xItem + random.nextInt(xItem >> 1);
                } else if (xy[IDX_X] == 0) {
                    // 减少文本左边缘一样的概率
                    xy[IDX_X] = Math.max(random.nextInt(xItem), xItem / 3);
                }
                xy[IDX_DIS_Y] = Math.abs(xy[IDX_Y] - yCenter);
                txt.setTag(xy);
                if (xy[IDX_Y] > yCenter) {
                    listTxtBottom.add(txt);
                } else {
                    listTxtTop.add(txt);
                }
            }
            attach2Screen(listTxtTop, xCenter, yCenter, yItem);
            attach2Screen(listTxtBottom, xCenter, yCenter, yItem);
            return true;
        }
        return false;
    }  

    /** 修正TextView的Y坐标将将其添加到容器上。 */
    private void attach2Screen(LinkedList<TextView> listTxt, int xCenter, int yCenter, int yItem) {
        int size = listTxt.size();
        sortXYList(listTxt, size);
        for (int i = 0; i < size; i++) {
            TextView txt = listTxt.get(i);
            int[] iXY = (int[]) txt.getTag();
            // Log.d("ANDROID_LAB", "fix[  " + txt.getText() + "  ] x:" +
            // iXY[IDX_X] + " y:" + iXY[IDX_Y] + " r2="
            // + iXY[IDX_DIS_Y]);
            // 第二次修正:修正y坐标
            int yDistance = iXY[IDX_Y] - yCenter;
            // 对于最靠近中心点的,其值不会大于yItem<br/>
            // 对于可以一路下降到中心点的,则该值也是其应调整的大小<br/>
            int yMove = Math.abs(yDistance);
            inner: for (int k = i - 1; k >= 0; k--) {
                int[] kXY = (int[]) listTxt.get(k).getTag();
                int startX = kXY[IDX_X];
                int endX = startX + kXY[IDX_TXT_LENGTH];
                // y轴以中心点为分隔线,在同一侧
                if (yDistance * (kXY[IDX_Y] - yCenter) > 0) {
                    // Log.d("ANDROID_LAB", "compare:" +
                    // listTxt.get(k).getText());
                    if (isXMixed(startX, endX, iXY[IDX_X], iXY[IDX_X] + iXY[IDX_TXT_LENGTH])) {
                        int tmpMove = Math.abs(iXY[IDX_Y] - kXY[IDX_Y]);
                        if (tmpMove > yItem) {
                            yMove = tmpMove;
                        } else if (yMove > 0) {
                            // 取消默认值。
                            yMove = 0;
                        }
                        // Log.d("ANDROID_LAB", "break");
                        break inner;
                    }
                }
            }
            // Log.d("ANDROID_LAB", txt.getText() + " yMove=" + yMove);
            if (yMove > yItem) {
                int maxMove = yMove - yItem;
                int randomMove = random.nextInt(maxMove);
                int realMove = Math.max(randomMove, maxMove >> 1) * yDistance / Math.abs(yDistance);
                iXY[IDX_Y] = iXY[IDX_Y] - realMove;
                iXY[IDX_DIS_Y] = Math.abs(iXY[IDX_Y] - yCenter);
                // 已经调整过前i个需要再次排序
                sortXYList(listTxt, i + 1);
            }
            FrameLayout.LayoutParams layParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT);
            layParams.gravity = Gravity.LEFT | Gravity.TOP;
            layParams.leftMargin = iXY[IDX_X];
            layParams.topMargin = iXY[IDX_Y];
            addView(txt, layParams);
            // 动画
            AnimationSet animSet = getAnimationSet(iXY, xCenter, yCenter, txtAnimInType);
            txt.startAnimation(animSet);
        }
    }  

    public AnimationSet getAnimationSet(int[] xy, int xCenter, int yCenter, int type) {
        AnimationSet animSet = new AnimationSet(true);
        animSet.setInterpolator(interpolator);
        if (type == OUTSIDE_TO_LOCATION) {
            animSet.addAnimation(animAlpha2Opaque);
            animSet.addAnimation(animScaleLarge2Normal);
            TranslateAnimation translate = new TranslateAnimation(
                    (xy[IDX_X] + (xy[IDX_TXT_LENGTH] >> 1) - xCenter) << 1, 0, (xy[IDX_Y] - yCenter) << 1, 0);
            animSet.addAnimation(translate);
        } else if (type == LOCATION_TO_OUTSIDE) {
            animSet.addAnimation(animAlpha2Transparent);
            animSet.addAnimation(animScaleNormal2Large);
            TranslateAnimation translate = new TranslateAnimation(0,
                    (xy[IDX_X] + (xy[IDX_TXT_LENGTH] >> 1) - xCenter) << 1, 0, (xy[IDX_Y] - yCenter) << 1);
            animSet.addAnimation(translate);
        } else if (type == LOCATION_TO_CENTER) {
            animSet.addAnimation(animAlpha2Transparent);
            animSet.addAnimation(animScaleNormal2Zero);
            TranslateAnimation translate = new TranslateAnimation(0, (-xy[IDX_X] + xCenter), 0, (-xy[IDX_Y] + yCenter));
            animSet.addAnimation(translate);
        } else if (type == CENTER_TO_LOCATION) {
            animSet.addAnimation(animAlpha2Opaque);
            animSet.addAnimation(animScaleZero2Normal);
            TranslateAnimation translate = new TranslateAnimation((-xy[IDX_X] + xCenter), 0, (-xy[IDX_Y] + yCenter), 0);
            animSet.addAnimation(translate);
        }
        animSet.setDuration(animDuration);
        return animSet;
    }  

    /**
     * 根据与中心点的距离由近到远进行冒泡排序。
     *
     * @param endIdx
     *            起始位置。
     * @param txtArr
     *            待排序的数组。
     *
     */
    private void sortXYList(LinkedList<TextView> listTxt, int endIdx) {
        for (int i = 0; i < endIdx; i++) {
            for (int k = i + 1; k < endIdx; k++) {
                if (((int[]) listTxt.get(k).getTag())[IDX_DIS_Y] < ((int[]) listTxt.get(i).getTag())[IDX_DIS_Y]) {
                    TextView iTmp = listTxt.get(i);
                    TextView kTmp = listTxt.get(k);
                    listTxt.set(i, kTmp);
                    listTxt.set(k, iTmp);
                }
            }
        }
    }  

    /** A线段与B线段所代表的直线在X轴映射上是否有交集。 */
    private boolean isXMixed(int startA, int endA, int startB, int endB) {
        boolean result = false;
        if (startB >= startA && startB <= endA) {
            result = true;
        } else if (endB >= startA && endB <= endA) {
            result = true;
        } else if (startA >= startB && startA <= endB) {
            result = true;
        } else if (endA >= startB && endA <= endB) {
            result = true;
        }
        return result;
    }  

    private int[] randomXY(Random ran, LinkedList<Integer> listX, LinkedList<Integer> listY, int xItem) {
        int[] arr = new int[4];
        arr[IDX_X] = listX.remove(ran.nextInt(listX.size()));
        arr[IDX_Y] = listY.remove(ran.nextInt(listY.size()));
        return arr;
    }  

    public void onGlobalLayout() {
        int tmpW = getWidth();
        int tmpH = getHeight();
        if (width != tmpW || height != tmpH) {
            width = tmpW;
            height = tmpH;
            show();
        }
    }  

    public Vector<String> getKeywords() {
        return vecKeywords;
    }  

    public void rubKeywords() {
        vecKeywords.clear();
    }  

    /** 直接清除所有的TextView。在清除之前不会显示动画。 */
    public void rubAllViews() {
        removeAllViews();
    }  

    public void setOnItemClickListener(OnClickListener listener) {
        itemClickListener = listener;
    }  

    // public void onDraw(Canvas canvas) {
    // super.onDraw(canvas);
    // Paint p = new Paint();
    // p.setColor(Color.BLACK);
    // canvas.drawCircle((width >> 1) - 2, (height >> 1) - 2, 4, p);
    // p.setColor(Color.RED);
    // }  

}
package com.js.cloudtags;

import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class CloudTags extends Activity implements OnClickListener{
    /** Called when the activity is first created. */

	public String[] keywords = {
			"QQ", "Sodino", "APK", "GFW", "铅笔",
            "短信", "桌面精灵", "MacBook Pro", "平板电脑", "雅诗兰黛",
            "卡西欧 TR-100", "笔记本", "SPY Mouse", "Thinkpad E40", "捕鱼达人",
            "内存清理", "地图", "导航", "闹钟", "主题",
            "通讯录", "播放器", "CSDN leak", "安全", "3D",
            "美女", "天气", "4743G", "戴尔", "联想",
            "欧朋", "浏览器", "愤怒的小鸟", "mmShow", "网易公开课",
            "iciba", "油水关系", "网游App", "互联网", "365日历",
            "脸部识别", "Chrome", "Safari", "中国版Siri", "A5处理器",
            "iPhone4S", "摩托 ME525", "魅族 M9", "尼康 S2500"
	};
	private KeywordsFlow keywordsFlow;
	private Button btnIn, btnOut;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnIn = (Button) findViewById(R.id.in);
        btnOut = (Button) findViewById(R.id.out);
        btnIn.setOnClickListener(this);
        btnOut.setOnClickListener(this);
        keywordsFlow = (KeywordsFlow) findViewById(R.id.keywordsflow);
        keywordsFlow.setDuration(800l);
        keywordsFlow.setOnItemClickListener(this);
        // 添加
        feedKeywordsFlow(keywordsFlow, keywords);
        keywordsFlow.go2Show(KeywordsFlow.ANIMATION_IN);
    }

    private static void feedKeywordsFlow(KeywordsFlow keywordsFlow, String[] arr) {
        Random random = new Random();
        for (int i = 0; i < KeywordsFlow.MAX; i++) {
            int ran = random.nextInt(arr.length);
            String tmp = arr[ran];
            keywordsFlow.feedKeyword(tmp);
        }
    }

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (v == btnIn) {
            keywordsFlow.rubKeywords();
            // keywordsFlow.rubAllViews();
            feedKeywordsFlow(keywordsFlow, keywords);
            keywordsFlow.go2Show(KeywordsFlow.ANIMATION_IN);
        } else if (v == btnOut) {
            keywordsFlow.rubKeywords();
            // keywordsFlow.rubAllViews();
            feedKeywordsFlow(keywordsFlow, keywords);
            keywordsFlow.go2Show(KeywordsFlow.ANIMATION_OUT);
        } else if (v instanceof TextView) {
            String keyword = ((TextView) v).getText().toString();
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            intent.setData(Uri.parse("http://www.google.com.hk/#q=" + keyword));
            startActivity(intent);
        }
	}  

}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <RelativeLayout
        android:id="@+id/bt_layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" >

        <Button
            android:id="@+id/in"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:text="In" />

        <Button
            android:id="@+id/out"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="Out" />
    </RelativeLayout>
>    

    <com.js.cloudtags.KeywordsFlow
        android:id="@+id/keywordsflow"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@id/bt_layout" />

</RelativeLayout>
时间: 2024-10-28 23:20:30

android 标签云的实现 关于x轴 冒泡排序~瞬间让你高达上的相关文章

百度联盟标签云广告由商家聚合页转变为竞价搜索页面

中介交易 SEO诊断 淘宝客 云主机 技术大厅 对于很多草根站长而言,我们的收入来源主要就是广告,为什么?因为我们这样的草根做的网站规模本来就比较小,而且就算我们有独到的运营思路也很难有渠道做一些商业化的东西.同时正是因为我们规模比较小,因此我们网站投放的广告也很少有那种商家直投的,而是通过所谓的广告联盟作为中介来投放广告的. 在国内草根站长中间,最被大家认可的还是两大互联网巨头的广告联盟产品,也就是全球最大搜索引擎谷歌旗下的谷歌联盟以及国内最大搜索引擎百度旗下的百度联盟.前者通常被很多草根站长

Android自定义控件ViewGroup实现标签云(四)_Android

前言: 前面几篇讲了自定义控件绘制原理Android自定义控件基本原理详解(一) ,Android自定义控件之自定义属性(二) ,Android自定义控件之自定义组合控件(三) ,常言道:"好记性不如烂笔头,光说不练假把式!!!",作为一名学渣就是因为没有遵循这句名言才沦落于此,所以要谨遵教诲,注重理论与实践相结合,今天通过自定义ViewGroup来实现一下项目中用到的标签云. 需求背景: 公司需要实现一个知识点的标签显示,每个标签的长度未知,如下图所示   基本绘制流程:  绘制原理

Android自定义控件ViewGroup实现标签云(四)

前言: 前面几篇讲了自定义控件绘制原理Android自定义控件基本原理详解(一) ,Android自定义控件之自定义属性(二) ,Android自定义控件之自定义组合控件(三) ,常言道:"好记性不如烂笔头,光说不练假把式!!!",作为一名学渣就是因为没有遵循这句名言才沦落于此,所以要谨遵教诲,注重理论与实践相结合,今天通过自定义ViewGroup来实现一下项目中用到的标签云. 需求背景: 公司需要实现一个知识点的标签显示,每个标签的长度未知,如下图所示 基本绘制流程: 绘制原理这里不

javascript实现动态标签云_javascript技巧

今天上学校的图书馆,看到了一个好玩的东西,特意百度了下,发现叫做"标签球",效果图为: 直接代码如下: CSS: #div1 {position:relative; width:350px; height:350px; border:1px solid #000; margin: 20px auto 0; } #div1 a {position:absolute; top:0px; left:0px; font-family: Microsoft YaHei; color:#000;

JavaScript实现的圆形浮动标签云效果实例_javascript技巧

本文实例讲述了JavaScript实现的圆形浮动标签云效果.分享给大家供大家参考.具体如下: 这里介绍的JS标签云效果,在鼠标的作用下会自动转动,整体上围绕成一个圆形,各个标签之间无需Div代码,直接文字+链接的形式,有多少就显示多少,JavaScript会自动调整显示数量,让视觉效果最佳. 运行效果如下图所示: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://

超酷的javascript文字云/标签云效果 &amp;#8211; D3 Cloud

在线演示 如果你想创建漂亮的文字云或者标签云效果的话,你可以考虑使用D3-Cloud,这是一个超棒的开源字体云效果javascript类库,基于知名的 D3.js,能够帮助你生成类似wordle.com风格的字体或者标签云效果. 这个类库使用HTML5画布来生成字体效果,整个布局算法可以异步实现,只需要设置时间块大小.并且支持动画特效.整体性能非常不错. 文字,字体和字体大小,旋转和边框距离都可以自定义.包含两个事件: word – 当每一个文字添加后触发 end – 当全部文字添加后触发 当然

JS网页制作实例:标签云

文章简介:js实现标签云效果. js实现标签云效果:   实现:1.随机方法:JavaScript代码function rand(num){ return parseInt(Math.random()*num+1); } 2.随机取色:JavaScript代码function randomcolor(){ var str=Math.ceil(Math.random()*16777215).toString(16); if(str.length<6){ str="0"+str; }

标签云并非浮云 优化效果表现活跃

事无巨细,用在SEO上,绝对是非常贴切的.在做SEO的各项工作中,很多时候,我们都是在做着小事情,但也正是因为这些小事情,组成了优化的总体效果.也可以理解为,要向将蜘蛛好好伺候好,光在一处撒食是没有用的,需要整体撒网. 做SEO的工作是枯燥而又富有发现的,当然,这句话也是说给同样是新手朋友们听的.在刚刚接触SEO相关工作的时候,确实容易出现这样那样的情绪,有的时候做的工作很多,短期没看到效果,容易情绪低落,这个时候,我们需要自我调整. 除了在心里上调整,更是要想办法在战术上调整.当然,必须时刻谨

python生产标签云

当列表已经不能满足人们对信息的呈现时,标签云这种展现方式很好地满足了人们关注重点.突出趋势.显示偏好的浏览需求,本文简单介绍下使用python生成标签云. 有两种方式: 1. 自己实现 (可以参考http://www.i-alive.com/post/11/) 2.使用现有库,主要是pytagcloud 本文主要是利用pytagcloud这个库进行标签云的生成.首先需要安装它,不过在此之前如果你的机器上没有安装pygame和simplejson两个python包,则需要先下载安装 他们:这三个包