`

Test

阅读更多
package com.testSurfaceView;

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.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

public class TestSurfaceView extends Activity {
        /** Called when the activity is first created. */
        Button btnSingleThread, btnDoubleThread;
        SurfaceView sfv;
        SurfaceHolder 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 = (SurfaceView) this.findViewById(R.id.SurfaceView01);
                sfh = sfv.getHolder();
                sfh.addCallback(new MyCallBack());// 自动运行surfaceCreated以及surfaceChanged
        }

        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 SurfaceHolder.Callback {

                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                int height) {
                        Log.i("Surface:", "Change");

                }

                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                        Log.i("Surface:", "Create");

                        // 用反射机制来获取资源中的图片ID和尺寸
                        Field[] fields = R.drawable.class.getDeclaredFields();
                        for (Field field : fields) {
                                if (!"icon".equals(field.getName()))// 除了icon之外的图片
                                {
                                        int index = 0;
                                        try {
                                                index = field.getInt(R.drawable.class);
                                        } catch (IllegalArgumentException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        } catch (IllegalAccessException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        // 保存图片ID
                                        imgList.add(index);
                                }
                        }
                        // 取得图像大小
                        Bitmap bmImg = BitmapFactory.decodeResource(getResources(),
                                        imgList.get(0));
                        imgWidth = bmImg.getWidth();
                        imgHeight = bmImg.getHeight();
                }

                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                        Log.i("Surface:", "Destroy");

                }

        }

        /**
         * 读取并显示图片的线程
         */
        class Load_DrawImage extends Thread {
                int x, y;
                int imgIndex = 0;

                public Load_DrawImage(int x, int y) {
                        this.x = x;
                        this.y = y;
                }

                public void run() {
                        while (true) {
                                Canvas c = sfh.lockCanvas(new Rect(this.x, this.y, this.x
                                                + imgWidth, this.y + imgHeight));
                                Bitmap bmImg = BitmapFactory.decodeResource(getResources(),
                                                imgList.get(imgIndex));
                                c.drawBitmap(bmImg, this.x, this.y, new Paint());
                                imgIndex++;
                                if (imgIndex == imgList.size())
                                        imgIndex = 0;

                                sfh.unlockCanvasAndPost(c);// 更新屏幕显示内容
                        }
                }
        };

        /**
         * 只负责绘图的线程
         */
        class DrawImage extends Thread {
                int x, y;

                public DrawImage(int x, int y) {
                        this.x = x;
                        this.y = y;
                }

                public void run() {
                        while (true) {
                                if (bitmap != null) {//如果图像有效
                                        Canvas c = sfh.lockCanvas(new Rect(this.x, this.y, this.x
                                                        + imgWidth, this.y + imgHeight));

                                        c.drawBitmap(bitmap, this.x, this.y, new Paint());

                                        sfh.unlockCanvasAndPost(c);// 更新屏幕显示内容
                                }
                        }
                }
        };

        /**
         * 只负责读取图片的线程
         */
        class LoadImage extends Thread {
                int imgIndex = 0;

                public void run() {
                        while (true) {
                                bitmap = BitmapFactory.decodeResource(getResources(),
                                                imgList.get(imgIndex));
                                imgIndex++;
                                if (imgIndex == imgList.size())//如果到尽头则重新读取
                                        imgIndex = 0;
                        }
                }
        };
}

 

<?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:rientation="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>
        <SurfaceView android:id="@+id/SurfaceView01"
                android:layout_width="fill_parent" android:layout_height="fill_parent"></SurfaceView>
</LinearLayout>

 

分享到:
评论

相关推荐

    BURNINTEST--硬件检测工具

    PassMark BurnInTest V5.3 Copyright (C) 1999-2008 PassMark Software All Rights Reserved http://www.passmark.com Overview ======== Passmark's BurnInTest is a software tool that allows all the major sub...

    eNetTest 网管内网单机测速工具

    eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速工具eNetTest 网管内网单机测速...

    parasoft c++Test9.0破解

    最好用的单元测试工具,除了这里你是找不到9.0版本的破解的。 ... 独立的版本破解: ... 把lic_client.jar复制到 ... c:\Program Files (x86)\Parasoft\Test\9.0\plugins\...这个是:plugins-c++Test For Visual Studio.7z

    Parasoft c++Test9.0破解文件

    c:\Program Files (x86)\Parasoft\C++test for Visual Studio\9.0\plugins\ 这个目录中 把plugins-Test for Virsual Studio.7z 中的文件覆盖到 c:\Program Files (x86)\Parasoft\Test for Visual Studio\9.0\...

    Modeltest 使用说明

    Modeltest 使用说明 Modeltest 是一个选择核苷酸替代模型的软件,通过和 PAUP 配合使用,可以选择出合适的 MODEL,并同时计算出相关参数。下面是 Modeltest 的使用说明和相关知识点: 一、Modeltest 概述 * Model...

    speedtest服务器搭建教程

    (speedtest服务器搭建教程) 本篇教程旨在指导读者搭建speedtest服务器,通过安装PHPStudy、配置WNMP和Nginx、下载并配置speedtest测速平台,实现本地测速功能。 一、 PHPStudy 安装和配置 PHPStudy 是一个集成...

    ECU-Test高级教程

    ### ECU-Test高级教程知识点解析 #### 一、ECU-Test概述 **ECU-Test**是一款专为汽车电子控制单元(ECU)开发与验证而设计的强大工具。它支持自动化测试流程,并能有效管理和控制整个测试环境,极大地提高了ECU开发...

    google test框架使用中文文档

    Google Test是Google开发的一款强大的C++测试框架,它使得C++开发者能够编写单元测试和集成测试,以确保代码的质量和稳定性。本文档将详细介绍Google Test框架的使用方法,包括基本概念、断言、测试套件、测试用例、...

    Parasoftc++ Test 9.0破解文件

    最好用的单元测试工具,除了这里你是找不到9.0版本的破解的。 ... 独立的版本破解: ... 把lic_client.jar复制到 ... c:\Program Files (x86)\Parasoft\Test\9.0\plugins\...这个是:( plugins-Test for Virsual Studio.7z )

    Test Track Client 使用说明(新)

    Test Track Client 使用说明 Test Track 是一个功能强大且实用的BUG管理软件,能够帮助测试工程师、开发工程师、开发主管和项目管理人员等角色更好地管理和跟踪项目中的BUG。该软件具有强大的管理功能和灵活的配置...

    Parasoft C++Test 9.5

    Parasoft C++Test 9.5是一款由Parasoft公司开发的专业自动化白盒测试工具,专注于C++编程语言的测试。它集成了多种测试策略,包括静态代码分析、动态测试、单元测试、代码覆盖率分析以及缺陷预防等功能,旨在提高...

    Test Bench 经典教程.rar

    Test Bench是电子设计自动化(EDA)领域中的一个重要概念,主要用于验证数字集成电路的设计。在硬件描述语言(HDL,如Verilog或VHDL)中,Test Bench是模拟真实硬件环境来测试设计功能的一个虚拟平台。它能帮助...

    CAN Test V2.53软件使用说明

    CAN Test V2.53 软件使用说明 CAN Test V2.53 软件是一款功能强大且易用的CAN总线测试工具,旨在帮助用户快速地测试和诊断CAN总线设备。以下是CAN Test V2.53 软件使用说明的详细知识点: 软件安装 CAN Test 软件...

    BurnInTest_8.1.rar

    《全面解析BurnInTest 8.1:稳定性与性能测试的专业工具》 在IT领域,软件测试是确保产品质量的关键环节,尤其是硬件稳定性测试,对于硬件设备制造商和系统集成商而言至关重要。BurnInTest是一款广受好评的硬件稳定...

    ECU-TEST基本教程

    ### ECU-TEST基本教程知识点概述 #### 一、ECU-TEST简介 ECU-TEST是一款由Vector公司开发的专业汽车电子控制单元(Electronic Control Unit, ECU)测试工具,它能够实现对ECU进行全面而深入的功能性测试,并且支持...

    Parasoft C++ test 9.2官方用户手册_eclipse_中文版

    《Parasoft C++test 9.2官方用户手册_eclipse_中文版》是一本详尽的指南,专为使用C++test工具的开发者提供在Eclipse集成开发环境中的使用方法。C++test是一款强大的静态代码分析和单元测试工具,旨在提高C++软件的...

    CANTest_Setup_V2.70.zip

    CANTest_Setup_V2.70.zip 是一个包含周立功CAN调试工具的软件安装包。这个工具主要用于汽车电子系统中的控制器局域网络(Controller Area Network, CAN)的测试和调试。CAN总线是一种广泛应用的多节点通信协议,尤其...

    PortTest串口调试工具

    **串口调试工具——PortTest详解** 在计算机通信领域,串行端口(Serial Port)是一种常见的硬件接口,用于设备间的通信。PortTest是一款专为串口调试设计的实用工具,它可以帮助用户检测和测试串口通讯功能,确保...

    C++test(VS2010插件版)简明操作手册-亲测可用.doc

    C++test简明操作手册 C++test是一款功能强大的测试工具,旨在帮助开发者编写高质量的代码。作为Parasoft公司的旗舰产品,C++test提供了全面的测试解决方案,涵盖了静态测试、动态测试、测试用例生成等多方面的测试...

    C++TEST及TESTBED工具对比

    "C++TEST及TESTBED工具对比" 本文将对 C++TEST 和 TESTBED 两个软件测试工具进行对比,旨在帮助读者更好地理解这两个工具的特点和优势。 一、软件测试必要性 软件测试是软件质量保证的关键步骤,在软件开发的各个...

Global site tag (gtag.js) - Google Analytics