zoukankan      html  css  js  c++  java
  • Android SurfaceView实现静态于动态画图效果

    本文是基于Android的SurfaceView的动态画图效果,实现静态和动态下的正弦波画图,可作为自己做图的简单参考,废话不多说,先上图,

    静态效果:

    动态效果:

     

    比较简单,代码注释的也比较详细,易懂,我就直接上代码了吧:

    1.main.xml

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent"  
    5.     android:orientation="vertical" >  
    6. <SurfaceView   
    7.     android:layout_width="fill_parent"  
    8.     android:layout_height="600px"  
    9.     android:id="@+id/surfaceview_draw"/>  
    10. <RelativeLayout android:layout_width="fill_parent"  
    11.     android:layout_height="wrap_content">  
    12. <Button android:layout_below="@id/surfaceview_draw"  
    13.     android:layout_marginLeft="7dip"  
    14.     android:id="@+id/simpledraw_btn"  
    15.     android:text="简单绘图"  
    16.     android:layout_width="wrap_content"  
    17.     android:layout_height="wrap_content"  
    18.     android:textSize="20dip"/>  
    19.   
    20. <Button  
    21.     android:id="@+id/timerdraw_btn"  
    22.     android:layout_width="wrap_content"  
    23.     android:layout_height="wrap_content"  
    24.     android:layout_toRightOf="@id/simpledraw_btn"  
    25.     android:text="定时绘图"   
    26.     android:textSize="20dip"/>  
    27. <Button   
    28.     android:id="@+id/cleardraw_btn"  
    29.     android:layout_width="wrap_content"  
    30.     android:layout_height="wrap_content"  
    31.     android:layout_toRightOf="@id/timerdraw_btn"  
    32.     android:text="清除图像"  
    33.     android:textSize="20dip"/>  
    34. </RelativeLayout>  
    35. </LinearLayout>  

    2.SurfaceViewDrawActivity.java

    1. package com.huangcheng.draw;  
    2.   
    3. import java.util.Timer;  
    4. import java.util.TimerTask;  
    5.   
    6. import android.app.Activity;  
    7. import android.graphics.Canvas;  
    8. import android.graphics.Color;  
    9. import android.graphics.Paint;  
    10. import android.graphics.Rect;  
    11. import android.os.Bundle;  
    12. import android.util.Log;  
    13. import android.view.SurfaceHolder;  
    14. import android.view.SurfaceView;  
    15. import android.view.View;  
    16. import android.view.View.OnClickListener;  
    17. import android.widget.Button;  
    18.   
    19. public class SurfaceViewDrawActivity extends Activity {  
    20.     /** Called when the activity is first created. */  
    21.     private SurfaceView surface_draw;  
    22.     private SurfaceHolder surfaceholder;  
    23.   
    24.     private Button simpledraw_btn;  
    25.     private Button timerdraw_btn;  
    26.     private Button cleardraw_btn;  
    27.   
    28.     private Timer timer;  
    29.     private TimerTask timertask;  
    30.   
    31.     private int[] Y;// 保存图像Y轴上的点   
    32.     private int centerY, oldX, oldY, currentX;// 保存水平中心线位置,上一个(x,y)点,当先绘制到的x   
    33.   
    34.     private volatile int signal=0;  
    35.     @Override  
    36.     public void onCreate(Bundle savedInstanceState) {  
    37.         super.onCreate(savedInstanceState);  
    38.         setContentView(R.layout.main);  
    39.         surface_draw = (SurfaceView) findViewById(R.id.surfaceview_draw);  
    40.         surfaceholder = surface_draw.getHolder();  
    41.   
    42.         simpledraw_btn = (Button) findViewById(R.id.simpledraw_btn);  
    43.         timerdraw_btn = (Button) findViewById(R.id.timerdraw_btn);  
    44.         cleardraw_btn = (Button) findViewById(R.id.cleardraw_btn);  
    45.         cleardraw_btn.setEnabled(false);  
    46.   
    47.         centerY = 300;  
    48.         Y = new int[getWindowManager().getDefaultDisplay().getWidth()];  
    49.         for (int i = 1; i < Y.length + 1; i++) {  
    50.             Y[i - 1] = centerY + (int) (100 * Math.sin(i * 2 * Math.PI / 180));  
    51.             // System.out.println("sin:"+100*Math.sin(i*2*Math.PI/180));   
    52.         }  
    53.         simpledraw_btn.setOnClickListener(new OnClickListener() {  
    54.   
    55.             @Override  
    56.             public void onClick(View arg0) {  
    57.                 // TODO Auto-generated method stub   
    58.                 simpledraw();// 静态绘制正弦图   
    59.                 signal=1;  
    60.                 simpledraw_btn.setEnabled(false);  
    61.                 timerdraw_btn.setEnabled(false);  
    62.                 cleardraw_btn.setEnabled(true);  
    63.             }  
    64.         });  
    65.         timerdraw_btn.setOnClickListener(new OnClickListener() {  
    66.   
    67.             @Override  
    68.             public void onClick(View arg0) {  
    69.                 // TODO Auto-generated method stub   
    70.                 oldX=0;  
    71.                 oldY=centerY;  
    72.                 currentX=0;  
    73.                 timer=new Timer();  
    74.                 timertask=new TimerTask() {  
    75.                       
    76.                     @Override  
    77.                     public void run() {  
    78.                         // TODO Auto-generated method stub   
    79.                         currentX++;  
    80.                         complexdraw(currentX);  
    81.                         if(currentX==Y.length-1){  
    82.                             ClearDraw();  
    83.                             currentX = 0;  
    84.                             oldX=0;  
    85.                             oldY=centerY;  
    86.                         }  
    87.                     }  
    88.                 };  
    89.                 timer.schedule(timertask, 05);// 动态绘制正弦图   
    90.                 signal=2;  
    91.                 simpledraw_btn.setEnabled(false);  
    92.                 timerdraw_btn.setEnabled(false);  
    93.                 cleardraw_btn.setEnabled(true);  
    94.             }  
    95.         });  
    96.         cleardraw_btn.setOnClickListener(new OnClickListener() {  
    97.               
    98.             @Override  
    99.             public void onClick(View arg0) {  
    100.                 // TODO Auto-generated method stub   
    101.                 if(signal==1){  
    102.                     ClearDraw();  
    103.                     simpledraw_btn.setEnabled(true);  
    104.                     timerdraw_btn.setEnabled(true);  
    105.                 }  
    106.                 if(signal==2){  
    107.                     timertask.cancel();  
    108.                     timer.cancel();  
    109.                     ClearDraw();  
    110.                     simpledraw_btn.setEnabled(true);  
    111.                     timerdraw_btn.setEnabled(true);  
    112.                 }  
    113.             }  
    114.         });  
    115.     }  
    116.     // 简单画图   
    117.     void simpledraw() {  
    118.         oldX = 0;  
    119.         oldY = centerY;  
    120.         Canvas canvas = surfaceholder  
    121.                 .lockCanvas(new Rect(oldX, 0, oldX + Y.length,  
    122.                         getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布   
    123.         Log.i("Canvas:X:",  
    124.                 String.valueOf(oldX) + "," + String.valueOf(oldX + Y.length));  
    125.   
    126.         Paint mPaint = new Paint();  
    127.         mPaint.setColor(Color.GREEN);// 画笔为绿色   
    128.         mPaint.setStrokeWidth(2);// 设置画笔粗细   
    129.   
    130.         int y;  
    131.   
    132.         for (int i = oldX + 1; i < Y.length; i++) {// 绘画正弦波   
    133.             y = Y[i - 1];  
    134.             canvas.drawLine(oldX, oldY, i, y, mPaint);  
    135.             // System.out.println("oldX:"+oldX+" oldY:"+oldY+",x:"+i+" y:"+y);   
    136.             oldX = i;  
    137.             oldY = y;  
    138.         }  
    139.         surfaceholder.unlockCanvasAndPost(canvas);  
    140.     }  
    141.   
    142.     // 消除画得图   
    143.     void ClearDraw() {  
    144.         Canvas canvas = surfaceholder.lockCanvas(null);  
    145.         canvas.drawColor(Color.BLACK);// 清除画布   
    146.         surfaceholder.unlockCanvasAndPost(canvas);  
    147.     }  
    148.     //动态画图   
    149.     void complexdraw(int current){  
    150.         Canvas canvas = surfaceholder  
    151.                 .lockCanvas(new Rect(oldX, 0, current,  
    152.                         getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布   
    153.         Log.i("Canvas:X:",  
    154.                 String.valueOf(oldX) + "," + String.valueOf(oldX + Y.length));  
    155.   
    156.         Paint mPaint = new Paint();  
    157.         mPaint.setColor(Color.GREEN);// 画笔为绿色   
    158.         mPaint.setStrokeWidth(2);// 设置画笔粗细   
    159.           
    160.         int y=Y[current-1];  
    161.         canvas.drawLine(oldX, oldY, current, y, mPaint);  
    162.         // System.out.println("oldX:"+oldX+" oldY:"+oldY+",x:"+i+" y:"+y);   
    163.         oldX = current;  
    164.         oldY = y;  
    165.         surfaceholder.unlockCanvasAndPost(canvas);  
    166.     }  
    167. }  
  • 相关阅读:
    .NetCore Grpc 客服端 工厂模式配置授权
    DOCKER 拉取 dotnet 镜像太慢 docker pull mcr.microsoft.com too slow
    Introducing .NET 5
    VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.
    Omnisharp VsCode Attaching to remote processes
    zookeeper3.5.5 centos7 完全分布式 搭建随记
    Hadoop2.7.7 centos7 完全分布式 配置与问题随记
    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
    SQL基础随记3 范式 键
    MySQL调优 优化需要考虑哪些方面
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4750030.html
Copyright © 2011-2022 走看看