ByteArrayOutputStream out = new ByteArrayOutputStream();
Bitmap bitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(),Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
this.draw(canvas);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
压缩JPEG格式的图片会比压缩PNG格式的图片快很多
有时当图片太大导致奔溃,可以尝试将图片移动到mipmap目录下,奔溃问题就可以解决
组件移动卡顿
解决方法1:
使用硬件加速
android:hardwareAccelerated="true"
解决方法2:
可以在1的基础上解决
在ondraw时候尽量不要处理太多的事情,比如画圆什么的,移动的尽量是一个固定的图片,比如移动bitmap
解决方法3:
移动的时候不要刷新整个屏幕,而是只刷新移动的区域
** 创建透明bitmap **
//不能使用RGB_565,因为RGB_565没有透明度属性
source = Bitmap.createBitmap((int) radius * 2+20, (int) radius * 2+20, Bitmap.Config.ARGB_8888);
target = Bitmap.createBitmap((int) radius * 2+20, (int) radius * 2+20, Bitmap.Config.ARGB_8888);
以下代码可以进程裁剪操作
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
生成的bitmap可能会产生密度大小的不同,所以需要进行调整密度
//重点:这里需要将bitmap的密度重新设置,否则会导致bitmap的尺寸改变
transparentCircle.setDensity(dm.densityDpi);
设置textColor的选中颜色,需要在selector中设置颜色
<item name="android:textColor">@drawable/templator_type_text_selectoritem>
Android UI线程(主线程)有几个特点:
只能在 UI 线程操作 UI 视图,不能在子线程中操作。
不能在 UI 线程中进行耗时操作,否则会阻塞 UI 线程,引起 ANR、卡顿等问题。
1.可以使用Handler更新UI
Handler mHandler = newHandler(){
@Override
publicvoid handleMessage(Message msg){
if(msg.what == 1){
textView.setText("Task Done!!");
}
}
};
mRunnable = new Runnable() {
@Override
publicvoid run() {
SystemClock.sleep(1000); // 耗时处理
mHandler.sendEmptyMessage(1);
}
};
private void startTask(){
new Thread(mRunnable).start();
}
2.AsyncTask
AsyncTask 的实例必须在 UI Thread 中创建。
只能在 UI 线程中调用 AsyncTask 的 execute 方法。
AsyncTask 被重写的四个方法是系统自动调用的,不应手动调用。
每个 AsyncTask 只能被执行一次,多次执行会引发异常。
AsyncTask 的四个方法,只有 doInBackground 方法是运行在其他线程中,其他三个方法都运行在 UI 线程中,也就说其他三个方法都可以进行 UI 的更新操作
** Activity的ui线程 **
activity.runOnUiThread(new Runnable() {
public void run() {
onPostExecute();
}
});