2013-06-03 54 views
1

我有一個視圖活動,其中包含一些UI元素,如滑塊,一些textViews和一個surfaceView。我想在surfaceView上繪製一個簡單的正弦波,除非我不知道如何做到這一點。我能找到的教程並沒有解決我的問題。Android - 在SurfaceView上繪製簡單的正弦波

所以基本上,我怎樣才能在我的xml佈局文件中定義的surfaceView上繪製正弦波?

回答

1

要繪製一個SurfaceView,你需要編寫自己的類來擴展SurfaceView。在你的XML佈局文件中使用這個類。那麼你必須重寫onDraw(Canvas canvas)來完成繪圖。使用Math.sin(double a)來獲得竇。

0

好的,這裏有一個簡單有趣的方法來繪製一個表面視圖的正弦。當然,這一切都做錯了,但它很好地說明了原則。

我知道谷歌的意見退出按鈕和我disagree。所以在那裏。

MainActivity.java:

package com.gladeworks.gwscope ; 

import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity 
{ 
    TextView textView = null; 
    SurfaceView surfaceView; 
    SurfaceHolder holder; 
    Canvas canvas; 
    Paint paint; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     textView = (TextView) findViewById(R.id.textView); 
     textView.setText("Press the Draw button!"); 
     surfaceView = (SurfaceView) findViewById(R.id.surfaceView); 
     holder = surfaceView.getHolder(); 
     holder.getSurface(); 
     paint = new Paint(); 

     final Button buttonExit = (Button) findViewById(R.id.buttonExit); 
     buttonExit.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View view) 
      { 
       exit(view); 
      } 
     }); 
     final Button buttonDraw = (Button) findViewById(R.id.buttonDraw); 
     buttonDraw.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View view) 
      { 
       draw(view); 
      } 
     }); 
    } 


    protected void draw(View view) //This gets called when the Draw button is clicked. 
    { 
     paint.setColor(Color.GREEN); 
     paint.setStrokeWidth(5); 

     canvas = holder.lockCanvas(); 
     if (canvas == null) { 
      textView.setText("Canvas is still null"); 
     } else { 
      float a, w,h,x,y; 
      w=canvas.getWidth(); 
      h=canvas.getHeight(); 
      canvas.drawRGB(32, 32, 255); //Clear the canvas to light blue 
      canvas.drawLine(0,h/2,(int)w,h/2,paint);//Draw a line from left to right as the y=0 line. 
      x=0; 
      while(x<w) 
      { 
       a=(x/w)*((float)2.0*(float)3.131592654); 
       y=(h/2)-((float)Math.sin(a)*(h/(float)2.1)); 

       canvas.drawPoint(x,y,paint); 

       x++; 
      } 


      holder.unlockCanvasAndPost(canvas); 
      textView.setText("Done drawing!, Canvas size="+w+"x"+h); 
     } 


    } 

    protected void exit(View view) 
    { 
     System.exit(0); 
    } 

} 

activity_main.xml中:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.gladeworks.gwscope.MainActivity"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Uninitialized" 
     android:id="@+id/textView" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignBottom="@+id/buttonExit" 
     android:layout_toLeftOf="@+id/buttonExit" 
     android:layout_toStartOf="@+id/buttonExit"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Quit" 
     android:id="@+id/buttonExit" 
     android:layout_alignTop="@+id/buttonDraw" 
     android:layout_toLeftOf="@+id/buttonDraw" 
     android:layout_toStartOf="@+id/buttonDraw"/> 


    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Draw" 
     android:id="@+id/buttonDraw" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true"/> 

    <SurfaceView 
     android:id="@+id/surfaceView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/buttonExit" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true"/> 

</RelativeLayout>