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

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內減少循環畫線的次數,可以提高繪圖效率。

     

    (審核編輯: 智匯小新)

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

    主站蜘蛛池模板: 洗地机,洗地机价格,扫地机,工业吸尘器,手推式洗地机,驾驶式洗地机,北京洗地机【北京高美环保科技有限公司】 | 医盟网-全国首家医疗信息化行业门户网站 | 龙淼环保-旋流-喷淋塔,高温布袋,脉冲布袋-单机-滤筒除尘器,活性炭吸附箱,催化燃烧设备,除尘器配件-沧州龙淼环保设备制造有限公司 | 前途汇医药科技(北京)有限公司 | 吸音板_隔音板多少钱_降噪声学材料_环保阻燃防火_吸声装饰工程定制_厂家价格直供 - 佛山天阶声学材料厂 | 塔罗牌占卜在线预测 - 塔罗牌爱好者 | 石膏砂浆生产线_特种砂浆生产线_轻质抹灰石膏设备-青岛环港重工科技有限公司 | 长沙物流公司|湖南货物运输公司|长沙第三方物流公司-国联物流 湖南第三方物流专家 | 乳化泵-高剪切乳化机-减速机支架-乳化罐-釜底乳化机【厂家】-浙江奥盛机械 | 西安防静电地板_防静电地板厂家_防静电地板价格_OA网络地板_写字楼架空地板_机房墙板安装-红梅防静电地板厂家直销 | 新乡市矿山起重机制造有限公司 | 阻垢剂|缓蚀剂|杀菌剂|分散剂|水处理剂|印染助剂|水处理药剂|造纸助剂|膜阻垢剂|缓蚀剂|HEDP|ATMP|螯合剂-山东凯瑞化学有限公司 水处理药剂生产厂家 | 专注欧美工业控制自动化设备-MRO工业品采购服务-科电远扬 | 郑州环球重工机械有限公司建筑垃圾处理专题网站 | 矿用精确定位系统,井下4G无线通讯系统,工作面集控系统,皮带保护系统-山东新云鹏电气有限公司 | 罗茨鼓风机维修_三叶罗茨风机维修厂家电话_山东长沙章丘鼓风机修理_章鼓高压真空泵「上门服务」 罗茨鼓风机价格_三叶罗茨鼓风机厂家-山东锦工有限公司 | 柯赛德斯-加美润滑油-专业做汽车工业润滑油品牌加盟代理 | 氧化镁|轻质氧化镁厂家|活性氧化镁价格【不好用免费退换】镁神股份 | 学汽修_汽修学校_汽修学校哪家好-江西万通汽车学院官网 | 项目可行性研究报告_稳评能评节能报告_节能报告收费标准-智汇中经(上海)管理咨询有限公司 | 苏州探测器清洗_烟感探头清洗_感烟探测器维修清洗_火灾探测器清洗报价/价格_进口国产消防设备清洗_江苏智淼探测器清洗厂家- | 泥沙泵_脱硫泵_潜水泵_离心泵_渣浆泵厂家|诚信为先-泰安华泰泵业制造有限公司 | 斜管填料_斜板填料_纤维球_果壳活性炭_立体网状填料_纤维球厂家-巩义市德科净水材料有限公司 | 切割片-砂轮片-抛光片-磨片-方格片-百叶片生产厂家定制加工-达蒙砂轮价格优惠 | 真空上料机_加料机_天津自动上料机_投料站_包装机加料_吸料机_粉体称重-天津市飞云粉体设备有限公司 | 郑州四棉纺织有限公司-现代化纺织企业| 苏州西服定制,西装定做时尚职业装品牌-尊羿西服定做网 | 汽车智能防撞系统_智能刹车_77G毫米波雷达_麒云科技疲劳驾驶预警 | 酒店宾馆一次性用品厂家-酒店洗漱用品,洗浴用品品牌方案-江苏欧佩 | 雨量计,翻斗雨量计,声波雨量计i,时差法流量计,时差法明渠流量计 - 徐州伟思水务科技有限公司 | 小耳朵电源_安防监控电源|小耳朵官网|电源适配器|摄像机电源|开关电源|小耳朵监控电源 | 深圳浪琴维修服务中心_浪琴售后保养服务网点_地址 | 小麦硬度指数仪-石灰活性测定仪-智能型砂强度仪-北京同德创业科技有限公司 | 烘干机_回转窑_破碎机_制砂机_洗砂机_球磨机-瑞光金属制品 | 驾驶洗地机|手推洗地车|天津洗地机|扫地车|仓库工厂扫地机|工业吸尘器|扫雪机|耐洁思 | 移动石料破碎机-颚式锤式反击式破碎机设备厂家_山东.青州富康机械 | 深圳奥力特化工产品有限公司企业网站 | 全球环保研究网_生态环境绿色产业咨询部_生态文明建设行业智库 ? | 兰州环氧地坪,兰州防火涂料-甘肃皓天环氧地坪工程 | 江寒必恋术在线阅读_江寒必恋术免费下载 - 江寒必恋术电子书 | 上海云屹国际快递-承接化工品_液体_粉末_化妆品_食品_锂电池等国际快递业务 |