Android 3d云标签

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWluZ3l1ZV8xMTI4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >一、自己定义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> 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<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 = 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 orange
		float[] tempColor2 = {1f,0f,0f,1}; //rgb Alpha
										//{0f,0f,1f,1}  blue      {0.1294f,0.1294f,0.1294f,1} grey
										//{0.9412f,0.7686f,0.2f,1} light orange
		mTagCloud.setTagColor1(tempColor1);//higher color
		mTagCloud.setTagColor2(tempColor2);//lower color
		mTagCloud.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;
    	//取出每一个数据放到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()));
    		//设置每一个TexView有自己指定的标签为自己的位置,以便后期操作
    		mTextView.get(i).setTag(i);
    		i++;
    	}
    	/** 用来自己主动播放的*/
    	new Timer().schedule(new TimerTask() {

			@Override
			public void run() {
				handler.sendEmptyMessage(1);
			}
		}, 0,200);
	}
	@SuppressLint("HandlerLeak")
	Handler handler=new Handler(){
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			mAngleX = (cuty/radius) *tspeed * TOUCH_SCALE_FACTOR;
			mAngleY = (-cutx/radius) *tspeed * TOUCH_SCALE_FACTOR;
			changPosition();
		}
	};
	@Override
	protected void onDraw(Canvas canvas){
		super.onDraw(canvas);
	}

	/**
	 * 触发事件
	 */
	@Override
	public 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;
	}
	/**
	 * 改变位置
	 */
	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();
    	}

	}
	/**
	 * 点击事件
	 * @param url
	 * @return
	 */
	View.OnClickListener OnTagClickListener(final String url){
		return new View.OnClickListener(){
			@Override
			public void onClick(View v) {

			}
		};
	}
}

二、自己定义迭代器

/**
 * 自己定义的迭代器
 * @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 float[] tagColor1;
	private float[] tagColor2;
	private int textSizeMax, textSizeMin;
	private float sin_mAngleX,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<Tag>());
	}
	public TagCloud(List<Tag> tags){
		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
	public Iterator iterator() {
		return tagCloud.iterator();
	}
	/**
	 * 创建
	 * @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();
	}
	/**
	 * create创建完,就须要update
	 */
	public void update(){
		if( Math.abs(mAngleX) > .1 || Math.abs(mAngleY) > .1 ){
			sineCosine( mAngleX, mAngleY, mAngleZ);
			updateAll();
		}
	}
	/**
	 * 计算每一个Tag的
	 * @param distrEven 是否依据字计算位置 true为是,否则字有覆盖的
	 */
	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)));
		}
	}
	/**
	 * 更新全部的Tag位置
	 */
	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);
		}
		//给Tag排序
		Collections.sort(tagCloud);
	}
	/**
	 * 计算字体颜色
	 * @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;
	}
	/**
	 * 计算字体的大小
	 * @param perc
	 * @return
	 */
	private int getTextSizeGradient(float perc){
		int size;
		size = (int)( perc*textSizeMax + (1-perc)*textSizeMin );
 		return size;
	}
	/**
	 * 计算圆形的x y z坐标
	 * @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);
	}
	/**
	 * 下面是get set方法
	 * @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];
		else
			return 0;
	}
	public float getGvalue(float[] color) {
		if (color.length>0)
			return color[1];
		else
			return 0;	}
	public float getBvalue(float[] color) {
		if (color.length>0)
			return color[2];
		else
			return 0;	}
	public float getAlphaValue(float[] color) {
		if (color.length >= 4)
			return color[3];
		else
			return 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;
	}	

}

三、自己定义数据

/**
 * Comparable接口 能够自己定义排序方式
 * @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;
    }	

	@Override
	public 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;
	}

}

四、调用

	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;
	}

源代码下载地址点击打开链接

时间: 2024-10-29 19:11:54

Android 3d云标签的相关文章

3D云标签

经常会看到PC端网页的首页右边靠下的区块会有一些类似于"云朵'一样的标签(a标签),鼠标移动上去会有轻微的浮动,每次加载,颜色都不一样,好奇之下,尝试的也写了一个,帮助朋友们做一个类似相关的友情链接时,显得更加有吸引力. 结构(HTML)代码如下: <div id="tagsList"> <a href="#" title="经分视窗">经分视窗</a> <a href="#"

3D球状标签云(兼容IE8)

看见一个很有趣的标签云,3D球状,兼容 IE 8,亲测可用!其他版本没有测试.觉得挺有意思就拿来记录下来,学习学习,本文下方会放出我看的文章地址,先看一下效果: 接下来是代码,html + css + js,不是基于jQuery的,所以不需要引入,代码复制下来就可以看到效果: <div id="div1"> <a href="http://www.cnblogs.com/ntt1219/">忘了滋味</a> <a href=

wordpress博客添加3D旋转标签云

为了让自己的博客首页更动感,我们可以添加3D旋转标签云,只需要添加插件即可. 方法如下: 1.登录wp管理后台,选择插件--安装插件,右上角搜索框搜索:WP-Cirrus 找到后选择安装,并启用. 2.外观--小工具--拖动WP-Cirrus到后侧首页功能项里面,保存即可. 3.在WP-Cirrus下拉列表中可以设置标题.标签云的高宽.刷新速度.标签最小值最大值.字体的颜色.背景颜色等等. 4.前提是你的博客中文章设置过标签,否则为空白. 5.刷新首页就能看到旋转的标签云,让你的博客也活泼起来.

android中include标签使用详解

android中include标签是为了便于控件的覆用的一个很好解决方案. 但是也有一些需要注意的地方,下面是本人在项目中碰到过的一个问题,做此记录,便于以后查看. include标签用法. 1.新建一个xml文件,命名 head.xml head.xml文件内容如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.

Android 3D引擎推荐

============问题描述============ 最近接到一个项目需要使用3D引擎,请教下Android平台下哪个3D游戏引擎比较好啊,最好是开源的,资料比较多的. ============解决方案1============ 很 多初学Android游戏开发 href="http://edu.gamfe.com/gamedev.html">游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有

Android 3D emulation 架构理解

Android Emulator 给用户提供  GPU on 选项,意思是利用 Host ( 就是执行 Emulator 的PC机) 的 GPU. 当然PC机必须把 OpenGL 的驱动装好 在实现上就是把 libGLESv1_CM.so  libGLESv2.so 替换掉,当system调用 gl的函数的时候,把调用打包为stream,并通过 pipe 发送到 host端处理,进入转化为对 host opengl的调用. 光这样还不够,还要把 libegl, libgralloc 都替换了,由

android中include标签的使用

转自:http://blog.sina.com.cn/s/blog_a364999b01017gxi.html android中include标签是为了便于控件的覆用的一个很好解决方案. 但是也有一些需要注意的地方,下面是本人在项目中碰到过的一个问题,做此记录,便于以后查看. include标签用法. 1.新建一个xml文件,命名 head.xmlhead.xml文件内容如下:<?xml version="1.0" encoding="utf-8"?>&

Android开发经典书籍下载——《Android 4高级编程》《疯狂Android讲义》《Android应用开发详解(郭宏志)》《Android应用案例开发大全》《Android 3D游戏开发技术》

这是我收集的关于android开发方面的经典书籍,高清PDF电子版,可以在我的百度网盘免费下载,希望对需要的朋友有帮助. 目录: <Android 4高级编程>(附完整源代码) <疯狂Android讲义> <Android应用开发详解(郭宏志)> <Android应用案例开发大全> <Android 3D游戏开发技术> <Android内核剖析 柯元旦> <深入理解Android  卷1> <深入理解Android

JavaScript实现云标签

其实很简单了,这次写了,保存起来,为了防止下次再写重复的代码~~~ <!doctype html> <html> <head> <meta charset="utf-8"> <title>JavaScript实现云标签</title> <style> .box-tags {width:400px;margin:50px auto;padding:20px;border:1px solid #eee;ba