当前位置:操作系统 > 安卓/Android >>

Android提高第三篇之Su易做图ceView(下)

上一篇简单介绍了Su易做图ceView的使用,这次就介绍Su易做图ceView的双缓冲使用。双缓冲是为了防止动画闪烁而实现的一种多线程应用,基于Su易做图ceView的双缓冲实现很简单,开一条线程并在其中绘图即可。本文介绍基于Su易做图ceView的双缓冲实现,以及介绍类似的更高效的实现方法。

        本文程序运行截图如下,左边是开单个线程读取并绘图,右边是开两个线程,一个专门读取图片,一个专门绘图:

\

 

对比一下,右边动画的帧速明显比左边的快,左右两者都没使用Thread.sleep()。为什么要开两个线程一个读一个画,而不去开两个线程像左边那样都“边读边画”呢?因为Su易做图ceView每次绘图都会锁定Canvas,也就是说同一片区域这次没画完下次就不能画,因此要提高双缓冲的效率,就得开一条线程专门画图,开另外一条线程做预处理的工作。

main.xml的源码:

view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:orientation="vertical"> 
 
    <LinearLayout android:id="@+id/LinearLayout01" 
        android:layout_width="wrap_content" android:layout_height="wrap_content"> 
        <Button android:id="@+id/Button01" android:layout_width="wrap_content" 
            android:layout_height="wrap_content" android:text="单个独立线程"></Button> 
        <Button android:id="@+id/Button02" android:layout_width="wrap_content" 
            android:layout_height="wrap_content" android:text="两个独立线程"></Button> 
    </LinearLayout> 
    <Su易做图ceView android:id="@+id/Su易做图ceView01" 
        android:layout_width="fill_parent" android:layout_height="fill_parent"></Su易做图ceView> 
</LinearLayout> 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 android:orientation="vertical">

 <LinearLayout android:id="@+id/LinearLayout01"
  android:layout_width="wrap_content" android:layout_height="wrap_content">
  <Button android:id="@+id/Button01" android:layout_width="wrap_content"
   android:layout_height="wrap_content" android:text="单个独立线程"></Button>
  <Button android:id="@+id/Button02" android:layout_width="wrap_content"
   android:layout_height="wrap_content" android:text="两个独立线程"></Button>
 </LinearLayout>
 <Su易做图ceView android:id="@+id/Su易做图ceView01"
  android:layout_width="fill_parent" android:layout_height="fill_parent"></Su易做图ceView>
</LinearLayout>
 

本文程序的源码:

 view plaincopy to clipboardprint?
package com.testSu易做图ceView;  
 
import java.lang.reflect.Field;  
import java.util.ArrayList;  
import android.app.Activity;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.Paint;  
import android.graphics.Rect;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.Su易做图ceHolder;  
import android.view.Su易做图ceView;  
import android.view.View;  
import android.widget.Button;  
 
public class testSu易做图ceView extends Activity {  
    /** Called when the activity is first created. */ 
    Button btnSingleThread, btnDoubleThread;  
    Su易做图ceView sfv;  
    Su易做图ceHolder sfh;  
    ArrayList<Integer> imgList = new ArrayList<Integer>();  
    int imgWidth, imgHeight;  
    Bitmap bitmap;//独立线程读取,独立线程绘图  
 
    @Override 
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
 
        btnSingleThread = (Button) this.findViewById(R.id.Button01);  
        btnDoubleThread = (Button) this.findViewById(R.id.Button02);  
        btnSingleThread.setOnClickListener(new ClickEvent());  
        btnDoubleThread.setOnClickListener(new ClickEvent());  
        sfv = (Su易做图ceView) this.findViewById(R.id.Su易做图ceView01);  
        sfh = sfv.getHolder();  
        sfh.addCallback(new MyCallBack());// 自动运行su易做图ceCreated以及su易做图ceChanged  
    }  
 
    class ClickEvent implements View.OnClickListener {  
 
        @Override 
        public void onClick(View v) {  
 
            if (v == btnSingleThread) {  
                new Load_DrawImage(0, 0).start();//开一条线程读取并绘图  
            } else if (v == btnDoubleThread) {  
                new LoadImage().start();//开一条线程读取  
                new DrawImage(imgWidth + 10, 0).start();//开一条线程绘图  
            }  
 
        }  
 
    }  
 
    class MyCallBack implements Su易做图ceHolder.Callback {  
 
        @Override 
        public void su易做图ceChanged(Su易做图ceHolder holder, int format, int width,  
                int height) {  
            Log.i("Su易做图ce:", "Change");  
 
        }  
 
        @Override&nb

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,