Android中使用SurfaceView简单绘制正弦余弦

 使用SurfaceView简单绘制正弦余弦:


1.首先在布局文件中创建SurfaceView,和两个按钮:

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/sin"
            android:text="正弦"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/cos"
            android:text="余弦"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    <SurfaceView
        android:id="@+id/sv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

2.定义轴线:

    //定义控件:
    private Button but1;
    private Button but2;
    private SurfaceHolder holder;
    private SurfaceView sv;
    private Paint paint;
    private Canvas canvas;
    //轴线宽高:
    final int HEIGHT=320;
    final int WIDTH=320;
    //实际的Y轴的位置:
    final int X_OFFSET=5;
    private int cx=X_OFFSET; 
    int centerY=HEIGHT/2;
    //Timer异步方法:
    Timer timer=new Timer();
    TimerTask task=null;

3.SurfaseView获取到Holder,实现回调方法:

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        //回调方法:
        holder=sv.getHolder();

        holder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                paints();//开始绘制

            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, intwidth,int height) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                timer.cancel();//方法停止
            }
        });
    }

4.为按钮设置点击事件+Timer异步执行方法:

private void initView() {
        but1 = (Button) findViewById(R.id.but1);
        but2 = (Button) findViewById(R.id.but2);

        but1.setOnClickListener(listener);
        but2.setOnClickListener(listener);
        sv = (SurfaceView) findViewById(R.id.sv);
    }
   View.OnClickListener listener=new View.OnClickListener() {
       @Override
       public void onClick(final View v) {
           paints();
           cx=X_OFFSET;
           if(task!=null){
               task.cancel();
           }
           task=new TimerTask() {
               @Override
               public void run() {
                    int cy=v.getId()==R.id.but1 ? centerY-(int)(100*Math.sin((cx-5)*2*Math.PI/150)): centerY-(int)(100*Math.cos(cx-5)*2*Math.PI/150);
                    Canvas canvas = holder.lockCanvas(new Rect(cx, cy - 2, cx + 2, cy + 2));
                    canvas.drawPoint(cx,cy,paint);
                    cx++;
                    if(cx> WIDTH){
                        task.cancel();
                        task=null;
                    }
                    holder.unlockCanvasAndPost(canvas);
               }
           };
           timer.schedule(task,0,50);
       }
   };

5.设置画笔,定义坐标轴:

    /**
     * 设置paint画笔的方法:
     */
    private void paints(){
        Canvas canvas = holder.lockCanvas();
        canvas.drawColor(Color.WHITE);
        paint=new Paint();
        paint.setColor(Color.BLUE);
//        paint.setStrokeWidth(1);
//        paint.setStyle(Paint.Style.FILL);
        //绘制坐标轴:
        canvas.drawLine(X_OFFSET,centerY,WIDTH,centerY,paint);
        canvas.drawLine(X_OFFSET,40,X_OFFSET,HEIGHT,paint);
        holder.unlockCanvasAndPost(canvas);
        holder.lockCanvas(new Rect(0,0,0,0));
        holder.unlockCanvasAndPost(canvas);
    }

6.效果如下:

猜你喜欢

转载自blog.csdn.net/LoverLeslie/article/details/81502202
今日推荐