Zwoptex生成的spritesheet除了可以导出png格式的图片外还有pvr格式。pvr格式是iOS的显示芯片可以直接读取的,不需要经过解析就能直接显示,所以渲染速度更快,更节省内存。
我特意在cocos2D 2.0 rc1版本做了一项测试:
一个空的cocos2D模版工程运行起来之后占用的内存大约是4MB。
直接用CCSprite显示一张2048*1024的数据格式为RGBA565的PNG图片之后,内存占用达到了20MB。
同样的情况下换成pvr格式之后,内存占用为16MB。也就是说png格式的图片占用了20-4=16MB,pvr格式的图片占用了16-4=12MB。节省了25%。
Zwoptex还有一个选项叫做“ccz压缩”,选中之后图像的大小几乎可以减小一半。这样的文件格式成了:xxx.pvr.ccz,cocos2d是可以识别的。
PVRTC2和PVRTC4是两种pvr压缩的图像格式,他们都是pvr文件。这两种图像格式比普通图像有更快的加载速度和更小的内存占用。
PVRTC4: Compressed format, 4 bits per pixel, ok image quality
PVRTC2: Compressed format, 2 bits per pixel, poor image quality
一般pvr格式文件的图像格式有:
RGBA8888: 32-bit texture with alpha channel, best image quality
RGBA4444: 16-bit texture with alpha channel, good image quality
RGB565: 16-bit texture without alpha channel, good image quality but no alpha (transparency)
图像占用内存的公式是:numBytes = width * height * bitsPerPixel / 8
也就是说2048*2048的RGBA8888占用内存16MB,而PVRTC4只占用2MB
源地址
android\system\core\include\private\android_filesystem_config.h
Runtime.getRuntime().exec("chmod 777 "+abspath).waitFor();
exec = Runtime.getRuntime().exec("su -c "+abspath);
Textview在日常开发工作中使用非常频繁,在这里简单总结一下其比较重要的用法。目标是设置textview的中一段文字的显示属性,例如指定文字要下划线显示(@XXX、#XXX#),文字替换成图片,文字加重、变色、变大等。
String str = "This is testing text!"
int start =str.indexOf("testing");
int end = start + "testing ".length();
SpannableStringBuilder style = new SpannableStringBuilder(str);
int size = 20; //20px
style.setSpan(new AbsoluteSizeSpan(size), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
int color = 0xff0000; //设置指定位置文字的颜色
style.setSpan(new ForegroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
...
textView.setText(style);
string.xml: <string name="testing">这是一个数字:%1$d, 这是两位数字:%2$d,这又是成都为3的字符串:%3$s</string>
String text = String.format(getResources().getString(R.string.testing), 1, 22, "三个字");
int index[] = new int[3];
index[0] = text.indexOf("1");
index[1] = text.indexOf("22");
index[2] = text.indexOf("三个字");
SpannableStringBuilder style=new SpannableStringBuilder(text);
style.setSpan(new ForegroundColorSpan(Color.RED),index[0],index[0]+1,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
style.setSpan(new ForegroundColorSpan(Color.RED),index[1],index[1]+2,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
style.setSpan(new BackgroundColorSpan(Color.RED),index[2],index[2]+3,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
textView.setText(style);
SpannableStringBuilder style = new SpannableStringBuilder("call: 110");
style.setSpan(new StyleSpan(Typeface.BOLD), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
style.setSpan(new URLSpan("110"), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(style);
textView.setMovementMethod(LinkMovementMethod.getInstance());
public class URLSpanNoUnderline extends ClickableSpan {
private final String mURL;
public URLSpanNoUnderline(String url) {
mURL = url;
}
public String getURL() {
return mURL;
}
@Override
public void onClick(View widget) {
Uri uri = (Uri) widget.getTag();
if(uri!=null) {
final Context context = widget.getContext();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
context.startActivity(intent);
}
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false); //取消下划线
ds.setColor(0xff0066ff); //指定文字颜色
//ds.setTextSize(ds.getTextSize()*1.1F);
}
}
<activity
android:name=".activity.XXXActivity"
android:configChanges="keyboardHidden|orientation"
android:theme="@android:style/Theme.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="_host"
android:scheme="_scheme" />
</intent-filter>
</activity>
本文由zhiweiofli编辑发布,转载请注明出处,谢谢。