Android 3d cloud tag
1. Custom View
Public class TagCloudView extends RelativeLayout {RelativeLayout navigation_bar; TextView mTextView1; private final float TOUCH_SCALE_FACTOR =. 8f; private float tspeed; private TagCloud mTagCloud; private float mAngleX = 0; private float mAngleY = 0; private float centerX, centerY; private float radius; private Context mContext; private List
MTextView; private List
MParams; private int shiftLeft; float dowx = 0; float dowy = 0; float cutx = 100; float cuty = 100; public TagCloudView (Context mContext, int width, int height, List
TagList) {this (mContext, width, height, tagList, 6, 34, 1);} public TagCloudView (Context mContext, int width, int height, List
TagList, int textSizeMin, int textSizeMax, int scrollSpeed) {super (mContext); this. mContext = mContext; tspeed = scrollSpeed; centerX = width/2; centerY = height/2; radius = Math. min (centerX * 0.95f, centerY * 0.95f); shiftLeft = (int) (Math. min (centerX * 0.15f, centerY * 0.15f); mTagCloud = new TagCloud (tagList, (int) radius, textSizeMin, textSizeMax); float [] tempColor1 = {0.9412f, 0.7686f, 0.2f, 1}; // rgb Alpha // {1f, 0f, 0f, 1} red {0.3882f, 0.21568f, 0.0f, 1} orange // {0.9412f, 0.7686f, 0.2f, 1} light orangefloat [] tempColor2 = {1f, 0f, 0f, 1}; // rgb Alpha // {0f, 0f, 1f, 1} blue {0.1294f, 0.1294f, 0.1294f, 1} gray // {0.9412f, 0.7686f, 0.2f, 1} light orangemTagCloud. setTagColor1 (tempColor1); // higher colormTagCloud. setTagColor2 (tempColor2); // lower colormTagCloud. setRadius (int) radius); mTagCloud. create (true); mTagCloud. setAngleX (mAngleX); mTagCloud. setAngleY (mAngleY); mTagCloud. update (); mTextView = new ArrayList
(); MParams = new ArrayList
(); Iterator
It = mTagCloud. iterator (); Tag tempTag; int I = 0; // extract each data and put it in the TexView while (it. hasNext () {tempTag = (Tag) it. next (); tempTag. setParamNo (I); mTextView. add (new TextView (this. mContext); mTextView. get (I ). setText (tempTag. getText (); mParams. add (new RelativeLayout. layoutParams (LayoutParams. WRAP_CONTENT, LayoutParams. WRAP_CONTENT); mParams. get (I ). addRule (RelativeLayout. ALIGN_PARENT_LEFT); mParams. get (I ). addRule (RelativeLayout. ALIGN_PARENT_TOP); mParams. get (I ). setMargins (int) (centerX-shiftLeft + tempTag. getLoc2DX (), (int) (centerY + tempTag. getLoc2DY (), 0, 0); mTextView. get (I ). setLayoutParams (mParams. get (I); mTextView. get (I ). setSingleLine (true); int mergedColor = Color. argb (int) (tempTag. getAlpha () * 255), (int) (tempTag. getColorR () * 255), (int) (tempTag. getColorG () * 255), (int) (tempTag. getColorB () * 255); mTextView. get (I ). setTextColor (mergedColor); mTextView. get (I ). setTextSize (int) (tempTag. getTextSize () * tempTag. getScale (); addView (mTextView. get (I); mTextView. get (I ). setOnClickListener (OnTagClickListener (tempTag. getUrl (); // set each TexView to have its own position as the tag, so that mTextView can be operated later. get (I ). setTag (I); I ++;}/** used for automatic playback */new Timer (). schedule (new TimerTask () {@ Overridepublic void run () {handler. sendEmptyMessage (1); }}, 0,200) ;}@ SuppressLint ("HandlerLeak") Handler handler = new Handler () {@ Overridepublic void handleMessage (Message msg) {super. handleMessage (msg); mAngleX = (cuty/radius) * tspeed * TOUCH_SCALE_FACTOR; mAngleY = (-cutx/radius) * tspeed * TOUCH_SCALE_FACTOR; changPosition ();}}; @ Overrideprotected void onDraw (Canvas canvas) {super. onDraw (canvas);}/*** trigger event */@ Overridepublic boolean onTouchEvent (MotionEvent e) {switch (e. getAction () {case MotionEvent. ACTION_DOWN: dowx = e. getX (); dowy = e. getY (); break; case MotionEvent. ACTION_UP: float upx = e. getX (); float upy = e. getY (); cutx = upx-dowx; cuty = upy-dowy; break; case MotionEvent. ACTION_MOVE: mAngleX = (cuty/radius) * tspeed * TOUCH_SCALE_FACTOR; mAngleY = (-cutx/radius) * tspeed * TOUCH_SCALE_FACTOR; changPosition (); break;} return true ;} /*** change location */private void changPosition () {mTagCloud. setAngleX (mAngleX); mTagCloud. setAngleY (mAngleY); mTagCloud. update (); Iterator
It = mTagCloud. iterator (); Tag tempTag; while (it. hasNext () {tempTag = (Tag) it. next (); mParams. get (tempTag. getParamNo ()). setMargins (int) (centerX-shiftLeft + tempTag. getLoc2DX (), (int) (centerY + tempTag. getLoc2DY (), 0, 0); mTextView. get (tempTag. getParamNo ()). setTextSize (int) (tempTag. getTextSize () * tempTag. getScale (); int mergedColor = Color. argb (int) (tempTag. getAlpha () * 255), (int) (tempTag. getColorR () * 255), (int) (tempTag. getColorG () * 255), (int) (tempTag. getColorB () * 255); mTextView. get (tempTag. getParamNo ()). setTextColor (mergedColor); mTextView. get (tempTag. getParamNo ()). bringToFront () ;}}/*** Click Event * @ param url * @ return */View. onClickListener OnTagClickListener (final String url) {return new View. onClickListener () {@ Overridepublic void onClick (View v ){}};}}
Ii. Custom iterator
/*** Custom iterator * @ author Administrator **/public class TagCloud implements Iterable{Private List
TagCloud; private int radius; private static final int DEFAULT_RADIUS = 3; private static final int TEXT_SIZE_MAX = 30, TEXT_SIZE_MIN = 4; private static final float [] DEFAULT_COLOR1 = {0.886f, 0.725f, 0.188f, 1f}; private static final float [] DEFAULT_COLOR2 = {0.3f, 0.3f, 0.3f, 1f}; private float [] tagColor1; private float [] tagColor2; private int textSizeMax, private float charts, cos_mAngleX, sin_mAngleY, cos_mAngleY, sin_mAngleZ, cos_mAngleZ; private float mAngleZ = 0; private float mAngleX = 0; private float mAngleY = 0; private int size = 0; private int smallest, largest; private boolean distrEven = true; public TagCloud () {this (new ArrayList
();} Public TagCloud (List
Tags) {this (tags, DEFAULT_RADIUS);} public TagCloud (List
Tags, int radius) {this (tags, radius, DEFAULT_COLOR1, DEFAULT_COLOR2, TEXT_SIZE_MIN, TEXT_SIZE_MAX);} public TagCloud (List
Tags, int radius, int textSizeMin, int textSizeMax) {this (tags, radius, DEFAULT_COLOR1, DEFAULT_COLOR2, textSizeMin, textSizeMax);} public TagCloud (List
Tags, int radius, float [] tagColor1, float [] tagColor2) {this (tags, radius, tagColor1, tagColor2, TEXT_SIZE_MIN, TEXT_SIZE_MAX);} public TagCloud (List
Tags, int radius, float [] tagColor1, float [] tagColor2, int textSizeMin, int textSizeMax) {this. tagCloud = tags; this. radius = radius; this. tagColor1 = tagColor1; this. tagColor2 = tagColor2; this. textSizeMax = textSizeMax; this. textSizeMin = textSizeMin;}/*** override method */@ Overridepublic Iterator iterator () {return tagCloud. iterator ();}/*** create * @ param distrEven */public void create (boolean distrEven) {this. d IstrEven = distrEven; positionAll (distrEven); sineCosine (mAngleX, mAngleY, mAngleZ); updateAll (); smallest = 9999; largest = 0; for (int I = 0; I <tagCloud. size (); I ++) {int j = tagCloud. get (I ). getPopularity (); largest = Math. max (largest, j); smallest = Math. min (smallest, j) ;}tag tempTag; for (int I = 0; I <tagCloud. size (); I ++) {tempTag = tagCloud. get (I); int j = tempTag. getPopularity (); float percentage = (smal Lest = largest )? 1.0f: (float) j-smallest)/(float) largest-smallest); float [] tempColor = getColorFromGradient (percentage); // (rgb Alpha) int tempTextSize = getTextSizeGradient (percentage); tempTag. setColorR (tempColor [0]); tempTag. setColorG (tempColor [1]); tempTag. setColorB (tempColor [2]); tempTag. setTextSize (tempTextSize);} this. size = tagCloud. size ();}/*** after creation, update */public void update () {if (Math. abs (mAngleX)>. 1 | Math. abs (mAngleY)>. 1) {sineCosine (mAngleX, mAngleY, mAngleZ); updateAll () ;}/ *** calculate the @ param distrEven of each Tag Based on the word to true, otherwise, the word */private void positionAll (boolean distrEven) {double phi = 0; double theta = 0; int max = tagCloud. size (); for (int I = 1; I
0) return color [0]; elsereturn 0;} public float getGvalue (float [] color) {if (color. length> 0) return color [1]; elsereturn 0;} public float getBvalue (float [] color) {if (color. length> 0) return color [2]; elsereturn 0;} public float getAlphaValue (float [] color) {if (color. length> = 4) return color [3]; elsereturn 0;} public float getAngleX () {return mAngleX;} public void setAngleX (float mAngleX) {this. mAngleX = mAngleX;} public float getAngleY () {return mAngleY;} public void setAngleY (float mAngleY) {this. mAngleY = mAngleY;} public int getSize () {return size ;}}
Iii. Custom Data
/*** The Comparable interface can customize the sorting method * @ author Administrator **/public class Tag implements Comparable
{Private String text, url; private int popularity; private int textSize; private float locX, locY, locZ; private float loc2DX, loc2DY; private float scale; private float colorR, colorG, colorB, alpha; private static final int DEFAULT_POPULARITY = 1; private int paramNo; public Tag (String text, int popularity) {this (text, 0f, 0f, 0f, 1.0f, popularity, "");} public Tag (String text, int popularity, String url) {this (text, 0f, 0f, 0f, 1.0f, popularity, url );} public Tag (String text, float locX, float locY, float locZ) {this (text, locX, locY, locZ, 1.0f, DEFAULT_POPULARITY ,"");} public Tag (String text, float locX, float locY, float locZ, float scale) {this (text, locX, locY, locZ, scale, DEFAULT_POPULARITY ,"");} public Tag (String text, float locX, float locY, float locZ, float scale, int popularity, String url) {this. text = text; this. locX = locX; this. locY = locY; this. locZ = locZ; this. loc2DX = 0; this. loc2DY = 0; this. colorR = 0.5f; this. colorG = 0.5f; this. colorB = 0.5f; this. alpha = 1.0f; this. scale = scale; this. popularity = popularity; this. url = url;} @ Overridepublic int compareTo (Tag another) {// return (int) (another. locZ-locZ);} public float getLocX () {return locX;} public void setLocX (float locX) {this. locX = locX;} public float getLocY () {return locY;} public void setLocY (float locY) {this. locY = locY;} public float getLocZ () {return locZ;} public void setLocZ (float locZ) {this. locZ = locZ;} public float getScale () {return scale;} public void setScale (float scale) {this. scale = scale;} public String getText () {return text;} public void setText (String text) {this. text = text;} public float getColorR () {return colorR;} public void setColorR (float colorR) {this. colorR = colorR;} public float getColorG () {return colorG;} public void setColorG (float colorG) {this. colorG = colorG;} public float getColorB () {return colorB;} public void setColorB (float colorB) {this. colorB = colorB;} public float getAlpha () {return alpha;} public void setAlpha (float alpha) {this. alpha = alpha;} public int getPopularity () {return popularity;} public void setPopularity (int popularity) {this. popularity = popularity;} public int getTextSize () {return textSize;} public void setTextSize (int textSize) {this. textSize = textSize;} public float getLoc2DX () {return loc2DX;} public void setLoc2DX (float loc2dx) {loc2DX = loc2dx;} public float getLoc2DY () {return loc2DY ;} public void setLoc2DY (float loc2dy) {loc2DY = loc2dy;} public int getParamNo () {return paramNo;} public void setParamNo (int paramNo) {this. paramNo = paramNo;} public String getUrl () {return url;} public void setUrl (String url) {this. url = url ;}}
Iv. Call
private TagCloudView mTagCloudView;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);Display display = getWindowManager().getDefaultDisplay(); @SuppressWarnings("deprecation")int width = display.getWidth();@SuppressWarnings("deprecation")int height = display.getHeight();List
myTagList= createTags();mTagCloudView = new TagCloudView(this, width, height, myTagList ); setContentView(mTagCloudView);mTagCloudView.requestFocus();mTagCloudView.setFocusableInTouchMode(true);}private List
createTags(){List
tempList = new ArrayList
();tempList.add(new Tag("Google", 7, "http://www.google.com")); tempList.add(new Tag("Yahoo", 3, "www.yahoo.com"));tempList.add(new Tag("CNN", 4, "www.cnn.com"));tempList.add(new Tag("MSNBC", 5, "www.msnbc.com"));tempList.add(new Tag("CNBC", 5, "www.CNBC.com"));tempList.add(new Tag("Facebook", 7, "www.facebook.com"));tempList.add(new Tag("Youtube", 3, "www.youtube.com"));tempList.add(new Tag("BlogSpot", 5, "www.blogspot.com"));tempList.add(new Tag("Bing", 3, "www.bing.com"));tempList.add(new Tag("Wikipedia", 8, "www.wikipedia.com"));tempList.add(new Tag("Twitter", 5, "www.twitter.com"));tempList.add(new Tag("Msn", 1, "www.msn.com"));tempList.add(new Tag("Amazon", 3, "www.amazon.com"));tempList.add(new Tag("Ebay", 7, "www.ebay.com"));tempList.add(new Tag("LinkedIn", 5, "www.linkedin.com"));tempList.add(new Tag("Live", 7, "www.live.com"));tempList.add(new Tag("Microsoft", 3, "www.microsoft.com"));tempList.add(new Tag("Flicker", 1, "www.flicker.com"));tempList.add(new Tag("Apple", 5, "www.apple.com"));tempList.add(new Tag("Paypal", 5, "www.paypal.com"));tempList.add(new Tag("Craigslist", 7, "www.craigslist.com"));tempList.add(new Tag("Imdb", 2, "www.imdb.com"));tempList.add(new Tag("Ask", 4, "www.ask.com"));tempList.add(new Tag("Weibo", 1, "www.weibo.com"));tempList.add(new Tag("Tagin!", 8, "http://scyp.idrc.ocad.ca/projects/tagin"));tempList.add(new Tag("Shiftehfar", 8, "www.shiftehfar.org"));tempList.add(new Tag("Soso", 5, "www.google.com"));tempList.add(new Tag("XVideos", 3, "www.xvideos.com"));tempList.add(new Tag("BBC", 5, "www.bbc.co.uk"));return tempList;}
Source code click to open the link