不论是游戏中的UI,还是应用中的UI,纹理九宫格拉伸都是必不可少的,因为采用这种拉伸方式,可以最大化的节省纹理资源,还能保证良好的表现效果!
把纹理用4条线分割成9部分(如上图),通过观察可以发现,5是最规则的形状(矩形),其次是2,6,8,4(矩形,但是和四个角有公共边),最后是四个角1,3,9,7(圆角矩形)
规则的图形在拉伸之后的效果是比较好的,如果是不规则的图形,则会在拉伸之后变形!
根据上图做拉伸制定规则:
(1)保证四个角1,3,9,7不做任何拉伸(2)与四个角有公共边的四个矩形2,6,8,4做单向拉伸,即保证与四个角的公共边不拉伸,例如2,8只进行横向拉伸,4,6只进行纵向拉伸
(3)中间部分5做双向拉伸,即横向,纵向同事拉伸
在UISprite中,对于不同类型有不同填充Shader定点的方法,参照UISprite.OnFill()
public override void OnFill (BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols) { switch (type) { case Type.Simple: SimpleFill(verts, uvs, cols); break; case Type.Sliced: SlicedFill(verts, uvs, cols); break; case Type.Filled: FilledFill(verts, uvs, cols); break; case Type.Tiled: TiledFill(verts, uvs, cols); break; } }基本的Sprite是一个矩形纹理,即两个三角形,4个顶点,参照
protected void SimpleFill (BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols)
九宫格拉伸的Sprite相当于9个矩形纹理拼合而成,并且有部分矩形做拉伸操作,根据Shader渲染三角形,需要传4x9=36个顶点,参照
protected void SlicedFill (BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols)
在onCreate()里是获取不到控件的width,height的,这个时候控件都没有measure,layout完毕,所以获取到的结果都是0。要获取控件的宽度、高度必须在measure、layout过程完毕之后。
有2种方法:
1.如lss所讲的一样:
ViewTreeObserver vto = mBtnSend.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int height = mBtnSend.getMeasuredHeight();
int width = mBtnSend.getMeasuredWidth();
System.out.println("height:" + height + " " + "width:" + width);
}
});
2.在Activity里重写方法
public void onWindowFocusChanged(boolean hasFocus);
在窗口第一次获得焦点的时候,肯定能获取到控件的width,height。
3.
作者:ani_di
版权所有,转载务必保留此链接 http://blog.csdn.net/ani_di
iHasApp这个用过的话,大概知道我说的是什么了。
schemeApp.json这个数据库里面只有scheme和appid,官方demo是使用appid到iTunes上查询完整信息,比如名字、图片等。 我写了点代码,到iTunes上抓了一些中文名字。
抓取的功能不难实现,问题是苹果发现大量请求时会做一些屏蔽,因此到后面成功率就不太高。断断续续一天时间,抓取到90%(貌似有些id过期or有问题)。每个人重复获取没意思,我就共享出来,免得大家做重复劳动。
https://github.com/annidy/schemeApp2
schemeApp2.json有一些我自己添加的中文应用,并不存在于原来里面,谁让人家主要针对外国用户呢。
PS: 此数据库目前并不完整,主要我这边时不时的被屏蔽。欢迎大家多跑几次抓包过程,就几分钟而已,把它更完善。