智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

Android應用之SurfaceView

來源:網絡

點擊:2299

A+ A-

所屬頻道:新聞中心

關鍵詞: Android,SurfaceView

        文章介紹了SurfaceView的用法。網上介紹SurfaceView的用法有很多,寫法也層出不同,例如繼承SurfaceView類,或者繼承SurfaceHolder.Callback類等,這個可以根據功能實際需要自己選擇,我這里就直接在普通的用戶界面調用SurfaceHolder的lockCanvas和unlockCanvasAndPost。

        先來看看程序運行的截圖:

    截圖1主要演示了直接把正弦波繪畫在SurfaceView上

     

    對比上面的左右兩圖,右圖用.lockCanvas(null),而左圖用.lockCanvas(new Rect(oldX, 0, oldX + length,
        getWindowManager().getDefaultDisplay().getHeight())),對比一下兩個效果,由于左圖是按指定Rect繪畫,所以效率會比右圖的全控件繪畫高些,并且在清屏之后(canvas.drawColor(Color.BLACK))不會留有上次繪畫的殘留。

     

    接下來貼出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> 
        <SurfaceView android:id="@+id/SurfaceView01" 
            android:layout_width="fill_parent" android:layout_height="fill_parent"></SurfaceView> 
    </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>
     <SurfaceView android:id="@+id/SurfaceView01"
      android:layout_width="fill_parent" android:layout_height="fill_parent"></SurfaceView>
    </LinearLayout>
     

    接下來貼出程序源碼:

    view plaincopy to clipboardprint?
    package com.testSurfaceView;  
     
    import java.util.Timer;  
    import java.util.TimerTask;  
     
    import android.app.Activity;  
    import android.graphics.Canvas;  
    import android.graphics.Color;  
    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 btnSimpleDraw, btnTimerDraw;  
        SurfaceView sfv;  
        SurfaceHolder sfh;  
     
        private Timer mTimer;  
        private MyTimerTask mTimerTask;  
        int Y_axis[],//保存正弦波的Y軸上的點  
        centerY,//中心線  
        oldX,oldY,//上一個XY點   
        currentX;//當前繪制到的X軸上的點  
     
        @Override 
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
     
            btnSimpleDraw = (Button) this.findViewById(R.id.Button01);  
            btnTimerDraw = (Button) this.findViewById(R.id.Button02);  
            btnSimpleDraw.setOnClickListener(new ClickEvent());  
            btnTimerDraw.setOnClickListener(new ClickEvent());  
            sfv = (SurfaceView) this.findViewById(R.id.SurfaceView01);  
            sfh = sfv.getHolder();  
     
            //動態繪制正弦波的定時器  
            mTimer = new Timer();  
            mTimerTask = new MyTimerTask();  
     
            // 初始化y軸數據  
            centerY = (getWindowManager().getDefaultDisplay().getHeight() - sfv  
                    .getTop()) / 2;  
            Y_axis = new int[getWindowManager().getDefaultDisplay().getWidth()];  
            for (int i = 1; i < Y_axis.length; i++) {// 計算正弦波  
                Y_axis[i - 1] = centerY  
                        - (int) (100 * Math.sin(i * 2 * Math.PI / 180));  
            }  
        }  
     
        class ClickEvent implements View.OnClickListener {  
     
            @Override 
            public void onClick(View v) {  
     
                if (v == btnSimpleDraw) {  
                    SimpleDraw(Y_axis.length-1);//直接繪制正弦波  
                  
                } else if (v == btnTimerDraw) {  
                    oldY = centerY;  
                    mTimer.schedule(mTimerTask, 0, 5);//動態繪制正弦波  
                }  
     
            }  
     
        }  
     
        class MyTimerTask extends TimerTask {  
            @Override 
            public void run() {  
     
                SimpleDraw(currentX);  
                currentX++;//往前進  
                if (currentX == Y_axis.length - 1) {//如果到了終點,則清屏重來  
                    ClearDraw();  
                    currentX = 0;  
                    oldY = centerY;  
                }  
            }  
     
        }  
          
        /* 
         * 繪制指定區域 
         */ 
        void SimpleDraw(int length) {  
            if (length == 0)  
                oldX = 0;  
            Canvas canvas = sfh.lockCanvas(new Rect(oldX, 0, oldX + length,  
                    getWindowManager().getDefaultDisplay().getHeight()));// 關鍵:獲取畫布  
            Log.i("Canvas:",  
                    String.valueOf(oldX) + "," + String.valueOf(oldX + length));  
     
            Paint mPaint = new Paint();  
            mPaint.setColor(Color.GREEN);// 畫筆為綠色  
            mPaint.setStrokeWidth(2);// 設置畫筆粗細  
     
            int y;  
            for (int i = oldX + 1; i < length; i++) {// 繪畫正弦波  
                y = Y_axis[i - 1];  
                canvas.drawLine(oldX, oldY, i, y, mPaint);  
                oldX = i;  
                oldY = y;  
            }  
            sfh.unlockCanvasAndPost(canvas);// 解鎖畫布,提交畫好的圖像  
        }  
     
        void ClearDraw() {  
            Canvas canvas = sfh.lockCanvas(null);  
            canvas.drawColor(Color.BLACK);// 清除畫布  
            sfh.unlockCanvasAndPost(canvas);  
     
        }  


    package com.testSurfaceView;

    import java.util.Timer;
    import java.util.TimerTask;

    import android.app.Activity;
    import android.graphics.Canvas;
    import android.graphics.Color;
    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 btnSimpleDraw, btnTimerDraw;
     SurfaceView sfv;
     SurfaceHolder sfh;

     private Timer mTimer;
     private MyTimerTask mTimerTask;
     int Y_axis[],//保存正弦波的Y軸上的點
     centerY,//中心線
     oldX,oldY,//上一個XY點
     currentX;//當前繪制到的X軸上的點

     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      btnSimpleDraw = (Button) this.findViewById(R.id.Button01);
      btnTimerDraw = (Button) this.findViewById(R.id.Button02);
      btnSimpleDraw.setOnClickListener(new ClickEvent());
      btnTimerDraw.setOnClickListener(new ClickEvent());
      sfv = (SurfaceView) this.findViewById(R.id.SurfaceView01);
      sfh = sfv.getHolder();

      //動態繪制正弦波的定時器
      mTimer = new Timer();
      mTimerTask = new MyTimerTask();

      // 初始化y軸數據
      centerY = (getWindowManager().getDefaultDisplay().getHeight() - sfv
        .getTop()) / 2;
      Y_axis = new int[getWindowManager().getDefaultDisplay().getWidth()];
      for (int i = 1; i < Y_axis.length; i++) {// 計算正弦波
       Y_axis[i - 1] = centerY
         - (int) (100 * Math.sin(i * 2 * Math.PI / 180));
      }
     }

     class ClickEvent implements View.OnClickListener {

      @Override
      public void onClick(View v) {

       if (v == btnSimpleDraw) {
        SimpleDraw(Y_axis.length-1);//直接繪制正弦波
       
       } else if (v == btnTimerDraw) {
        oldY = centerY;
        mTimer.schedule(mTimerTask, 0, 5);//動態繪制正弦波
       }

      }

     }

     class MyTimerTask extends TimerTask {
      @Override
      public void run() {

       SimpleDraw(currentX);
       currentX++;//往前進
       if (currentX == Y_axis.length - 1) {//如果到了終點,則清屏重來
        ClearDraw();
        currentX = 0;
        oldY = centerY;
       }
      }

     }
     
     /*
      * 繪制指定區域
      */
     void SimpleDraw(int length) {
      if (length == 0)
       oldX = 0;
      Canvas canvas = sfh.lockCanvas(new Rect(oldX, 0, oldX + length,
        getWindowManager().getDefaultDisplay().getHeight()));// 關鍵:獲取畫布
      Log.i("Canvas:",
        String.valueOf(oldX) + "," + String.valueOf(oldX + length));

      Paint mPaint = new Paint();
      mPaint.setColor(Color.GREEN);// 畫筆為綠色
      mPaint.setStrokeWidth(2);// 設置畫筆粗細

      int y;
      for (int i = oldX + 1; i < length; i++) {// 繪畫正弦波
       y = Y_axis[i - 1];
       canvas.drawLine(oldX, oldY, i, y, mPaint);
       oldX = i;
       oldY = y;
      }
      sfh.unlockCanvasAndPost(canvas);// 解鎖畫布,提交畫好的圖像
     }

     void ClearDraw() {
      Canvas canvas = sfh.lockCanvas(null);
      canvas.drawColor(Color.BLACK);// 清除畫布
      sfh.unlockCanvasAndPost(canvas);

     }
    }

    注意一下 for (int i = oldX + 1; i < length; i++) {// 繪畫正弦波 這句,在.lockCanvas()指定Rect內減少循環畫線的次數,可以提高繪圖效率。

     

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內容及圖片均來自網絡及各大主流媒體。版權歸原作者所有。如認為內容侵權,請聯系我們刪除。

    主站蜘蛛池模板: 深圳社区邦家政公司-保姆_月嫂_育儿嫂 _早教育婴师_家政钟点工_家政培训_家政加盟- 社区邦优质生活服务 专业、标准化、便捷、安心,一站式家庭服务平台,服务专业有保障 ! | 济南手板_山东快速成型-山东嘉瑞杰机械科技有限公司 | 水上游乐设备 - 郑州亿浪水上乐园设备有限公司| 装盒机|装箱机|封箱机|全自动化包装生产线尽在利悦包装机械 | 移动破碎站-洗沙机-球磨制砂机-污泥处理-青州冠诚重工机械有限公司 | 液晶拼接屏_三星46寸/55寸/LG液晶拼接屏_深圳拼接墙厂家_电视大屏幕液晶拼接_高清工业级液晶监视器 | 专利申请|知识产权贯标|商标提异议|国外专利申请-润平知识产权 | 无锡今飞激光技术有限公司-手持激光焊接机_激光打标机_激光清洗机_平台激光焊接机_焊接专机- | 五金冲压件生产厂家_加工五金拉伸件-沧州浚鼎机械制造有限公司-沧州浚鼎机械制造有限公司 | 汽车蓄电池配件_蓄电池维护保养产品_叉车电池配件研发生产厂家—联鸿能源 | 耐磨工业软管,PTFE耐腐蚀软管,耐磨喷砂胶管,超耐磨软管厂家,漯河利通液压管利通科技-耐磨工业软管,PTFE耐腐蚀软管,耐磨喷砂胶管,超耐磨软管厂家,漯河利通液压管利通科技 | 嘉兴中诚环保科技股份有限公司_PVC_润滑剂_抗氧剂_辅助热稳定剂 嘉兴市南湖斋食品股份有限公司_南湖斋 | 乌兰察布市集宁牧田饲料科技有限公司-乌兰察布奶牛饲料|饲料原料加工|精品羊料 | 一站式管材,型材,板材,焊接加工等工程材料批发商-佛山市佛孟钢铁有限公司 | 山东汇河环保科技集团有限公司,水囊水袋,水罐,油囊,预压水袋,吊重水袋_山东汇河环保科技集团有限公司,水囊水袋,水罐,油囊,预压水袋,吊重水袋 | 塑木地板-木塑地板厂家「云南昆明楚雄曲靖玉溪塑木地板」云南云冶中信塑木新型材料有限公司 | 江西省力速数控机械有限公司丨火花机丨龙门加工中心丨镜面火花机丨卧式加工中心 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 重庆监控安装_监控系统工程_高清监控摄像头-重庆监控系统安装公司 | 太原万通汽车学校[官网]-太原好的汽修培训学校,学新能源汽车技术,学汽修,学汽车检测与维修技术 | 云南自考网_云南自学考试网| 首页-西安汉沣精密机械有限公司 首页-上海钢之杰智能建筑集团股份有限公司 | 推荐|广佛一条龙高端茶到底有多香 | 市南人才网_市南招聘网_求职找工作平台 | 文化艺术网-专注文化,服务艺术| 深圳专卖店设计,餐饮空间设计,酒店空间策划设计【左右高端人文空间设计公司】 | 星干线艺考_导演艺考培训班_播音主持艺考_表演艺考培训班-助你考上北京电影学院影视表演系 | 气相色谱仪生产厂家批发价格找上海惠分科学分析仪器有限公司 | 美标球阀_美标闸阀-浙江川一阀门有限公司 | 水性漆_水性漆厂家_水性涂料加盟代理_两只璧琥全漆定制官网 | 阻抗分析仪 阻抗测试仪 介电常数测试仪 充电枪测试仪-苏州腾斯凯电子科技有限公司 | 武汉东湖高新集团股份有限公司官网 | 呕吐毒素快速检测仪-黄曲霉毒素测定仪-玉米赤霉烯酮快速检测卡-南京微测生物科技有限公司 | 上饶市蚂蚁搬家有限公司,上饶搬家公司,上饶同城搬家,上饶同城搬家电话,上饶搬家哪家好,上饶搬家公司电话 | 值得信赖的云计算 - 美儿云互联 直饮水设备-纯水设备-软化水设备 - 亿家清泉水处理设备厂家 | 移动石料破碎机-颚式锤式反击式破碎机设备厂家_山东.青州富康机械 | 箱式污泥采样器-全自动旋转振荡器-恒温石墨电热板-常州亿通分析仪器制造有限公司 | 西安泰富西玛电机_西玛电机_西安西玛电机 | 心理咨询室设备_音乐放松椅_心理测评系统_情绪宣泄设备厂家 | 消字号牙膏代加工|面膜代加工|凝胶贴牌|漱口水贴牌-南京三盾药业有限公司-消字号牙膏代加工|面膜代加工|凝胶贴牌|漱口水贴牌-南京三盾药业有限公司 | 上海纳美鞋业有限公司|