Android 3d cloud tag and android3d 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 <TextView> mTextView; private List <RelativeLayout. layoutParams> mParam S; private int shiftLeft; float dowx = 0; float dowy = 0; float cutx = 100; float cuty = 100; public TagCloudView (Context mContext, int width, int height, list <Tag> tagList) {this (mContext, width, height, tagList, 6, 34, 1);} public TagCloudView (Context mContext, int width, int height, list <Tag> tagList, int textSizeMin, int textSizeMax, int scrollSpeed) {super (mContext); this. mContext = mContext; tspeed = SC RollSpeed; 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 <TextView> (); MParams = new ArrayList <RelativeLayout. LayoutParams> (); 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 ). a DdRule (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. getColor B () * 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. se NdEmptyMessage (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 onTouch Event (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 <Object> {private List <Tag> 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 floa T [] tagColor1; private float [] tagColor2; private int textSizeMax, textSizeMin; private float sin_mAngleX, cosine, cosine, 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 <Tag> ();} public TagCloud (List <Tag> tag S) {this (tags, DEFAULT_RADIUS);} public TagCloud (List <Tag> tags, int radius) {this (tags, radius, DEFAULT_COLOR1, DEFAULT_COLOR2, TEXT_SIZE_MIN, TEXT_SIZE_MAX );} public TagCloud (List <Tag> tags, int radius, int textSizeMin, int textSizeMax) {this (tags, radius, DEFAULT_COLOR1, DEFAULT_COLOR2, textSizeMin, textSizeMax );} public TagCloud (List <Tag> tags, int radius, float [] tagColor1, float [] tagColor2) {this (Tags, radius, tagColor1, tagColor2, TEXT_SIZE_MIN, TEXT_SIZE_MAX);} public TagCloud (List <Tag> 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 () {retur N tagCloud. iterator ();}/*** create * @ param distrEven */public void create (boolean distrEven) {this. distrEven = 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 = (smallest = 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 <max + 1; I ++) {if (distrEven) {phi = Math. acos (-1.0 + (2.0 * I-1.0)/max); theta = Math. sqrt (max * Math. PI) * phi;} else {phi = Math. random () * (Math. PI); theta = Math. random () * (2 * Math. PI);} tagCloud. get (I-1 ). setLocX (int) (radius * Math. cos (theta) * Math. sin (phi); tagCloud. get (I-1 ). setLocY (int) (radius * Math. sin (theta) * Math. sin (phi); tagCloud. get (I-1 ). setLocZ (int) (radius * Math. cos (phi);}/*** update all Tag locations */private void updateAll () {int max = tagCloud. size (); for (int j = 0; j <max; j ++) {float rx1 = (tagCloud. get (j ). getLocX (); float ry1 = (tagCloud. get (j ). getLocY () * cos_mAngleX + tagCloud. get (j ). getLocZ () *-sin_mAngleX; float rz1 = (tagCloud. get (j ). getLocY () * sin_mAngleX + tagCloud. get (j ). getLocZ () * cos_mAngleX; float rx2 = rx1 * cos_mAngleY + rz1 * sin_mAngleY; float ry2 = ry1; float rz2 = rx1 *-sin_mAngleY + rz1 * cos_mAngleY; float rx3 = rx2 * cos_mAngleZ + ry2 *-sin_mAngleZ; float ry3 = rx2 * sin_mAngleZ + ry2 * cos_mAngleZ; float rz3 = rz2; tagCloud. get (j ). setLocX (rx3); tagCloud. get (j ). setLocY (ry3); tagCloud. get (j ). setLocZ (rz3); int diameter = 2 * radius; float per = diameter/(diameter + rz3); tagCloud. get (j ). setLoc2DX (int) (rx3 * per); tagCloud. get (j ). setLoc2DY (int) (ry3 * per); tagCloud. get (j ). setScale (per); tagCloud. get (j ). setAlpha (per/2);} // sort Collections for tags. sort (tagCloud);}/*** calculate the font color * @ param perc * @ return */private float [] getColorFromGradient (float perc) {float [] tempRGB = new float [4]; tempRGB [0] = (perc * (tagColor1 [0]) + (1-perc) * (tagColor2 [0]); tempRGB [1] = (perc * (tagColor1 [1]) + (1-perc) * (tagColor2 [1]); tempRGB [2] = (perc * (tagColor1 [2]) + (1-perc) * (tagColor2 [2]); tempRGB [3] = 1; return tempRGB ;} /*** calculate the font size * @ param perc * @ return */private int getTextSizeGradient (float perc) {int size; size = (int) (perc * textSizeMax + (1-perc) * textSizeMin); return size ;} /*** calculate the x y zcoordinate of the circle * @ param mAngleX * @ param mAngleY * @ param mAngleZ */private void sineCosine (float mAngleX, float mAngleY, float mAngleZ) {double degToRad = (Math. PI/180); sin_mAngleX = (float) Math. sin (mAngleX * degToRad); cos_mAngleX = (float) Math. cos (mAngleX * degToRad); sin_mAngleY = (float) Math. sin (mAngleY * degToRad); cos_mAngleY = (float) Math. cos (mAngleY * degToRad); sin_mAngleZ = (float) Math. sin (mAngleZ * degToRad); cos_mAngleZ = (float) Math. cos (mAngleZ * degToRad);}/*** The following is the get set Method * @ return */public int getRadius () {return radius;} public void setRadius (int radius) {this. radius = radius;} public float [] getTagColor1 () {return tagColor1;} public void setTagColor1 (float [] tagColor) {this. tagColor1 = tagColor;} public float [] getTagColor2 () {return tagColor2;} public void setTagColor2 (float [] tagColor2) {this. tagColor2 = tagColor2;} public float getRvalue (float [] color) {if (color. length> 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 <Tag> {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<Tag> myTagList= createTags();mTagCloudView = new TagCloudView(this, width, height, myTagList ); setContentView(mTagCloudView);mTagCloudView.requestFocus();mTagCloudView.setFocusableInTouchMode(true);}private List<Tag> createTags(){List<Tag> tempList = new ArrayList<Tag>();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
How to program 3d tag cloud on android system (3d tag cloud special effect)
Hello! First, there are many types of logs
Log. v (String tag, String msg); // redundant message
Log. d (String tag, String msg); // debug the message
Log. I (String tag, String msg); // common message
Log. w (String tag, String msg); // warning message
Log. e (String tag, String msg); // error message
The following statement can be used to create a log tag.
Private static final String TAG = "the tag you want to set here"
In the program, I usually use Log. v (TAG, "information to be printed ")
In this way, the custom TAG can be displayed in logcat.
Q: Is 3d cloud tag implemented on Android?
Blog.csdn.net/..615529
This is the idea of implementation. At present, there is seldom a comprehensive solution shared on the Internet,
However, there are many basic functions
Download.csdn.net/detail/wl455624651/3866247
For example ~
I am also working on the 3D tag cloud. Trying to solve