正弦波大家在数学中都学过,但是在Android开发中如何绘制正弦波呢?本文将给出一个开发实例演示绘制过程。

      大家先来看看最后的效果图:

Android开发实例:绘制正弦波

       下面贴上具体的代码:

       1. layout下的main.xml文件

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <LinearLayout    
  4.   
  5.     xmlns:android="http://schemas.android.com/apk/res/android"  
  6.   
  7.     android:layout_width="fill_parent"  
  8.   
  9.     android:layout_height="fill_parent"  
  10.   
  11.     android:orientation="vertical" >  
  12.   
  13.     <LinearLayout    
  14.   
  15.         android:layout_width="match_parent"  
  16.   
  17.         android:layout_height="wrap_content"  
  18.   
  19.         android:orientation="horizontal">  
  20.   
  21.     <TextView  
  22.   
  23.         android:text="频率:"  
  24.   
  25.         android:textSize="20sp"  
  26.   
  27.         android:layout_width="wrap_content"  
  28.   
  29.         android:layout_height="wrap_content"/>  
  30.   
  31.     <EditText    
  32.   
  33.         android:id="@+id/frequency"  
  34.   
  35.         android:textSize="20sp"  
  36.   
  37.         android:layout_width="75dip"  
  38.   
  39.         android:layout_height="wrap_content"  
  40.   
  41.         android:text="3"/>  
  42.   
  43.     <TextView  
  44.   
  45.         android:text="赫兹"  
  46.   
  47.         android:textSize="20sp"  
  48.   
  49.         android:layout_width="wrap_content"  
  50.   
  51.         android:layout_height="wrap_content"/>  
  52.   
  53.     </LinearLayout>  
  54.   
  55.      <LinearLayout    
  56.   
  57.         android:layout_width="match_parent"  
  58.   
  59.         android:layout_height="wrap_content"  
  60.   
  61.         android:orientation="horizontal">  
  62.   
  63.     <TextView  
  64.   
  65.         android:text="相位:"  
  66.   
  67.         android:textSize="20sp"  
  68.   
  69.         android:layout_width="wrap_content"  
  70.   
  71.         android:layout_height="wrap_content"/>  
  72.   
  73.     <EditText    
  74.   
  75.         android:id="@+id/phase"  
  76.   
  77.         android:textSize="20sp"  
  78.   
  79.         android:layout_width="75dip"  
  80.   
  81.         android:layout_height="wrap_content"  
  82.   
  83.         android:text="30.0"/>  
  84.   
  85.     <TextView  
  86.   
  87.         android:text="度"  
  88.   
  89.         android:textSize="20sp"  
  90.   
  91.         android:layout_width="wrap_content"  
  92.   
  93.         android:layout_height="wrap_content"/>  
  94.   
  95.     </LinearLayout>  
  96.   
  97.      <LinearLayout    
  98.   
  99.         android:layout_width="match_parent"  
  100.   
  101.         android:layout_height="wrap_content"  
  102.   
  103.         android:orientation="horizontal">  
  104.   
  105.     <TextView  
  106.   
  107.         android:text="幅值:"  
  108.   
  109.         android:textSize="20sp"  
  110.   
  111.         android:layout_width="wrap_content"  
  112.   
  113.         android:layout_height="wrap_content"/>  
  114.   
  115.     <EditText    
  116.   
  117.         android:id="@+id/amplifier"  
  118.   
  119.         android:textSize="20sp"  
  120.   
  121.         android:layout_width="75dip"  
  122.   
  123.         android:layout_height="wrap_content"  
  124.   
  125.         android:text="100"/>  
  126.   
  127.     <TextView  
  128.   
  129.         android:text="单位"  
  130.   
  131.         android:textSize="20sp"  
  132.   
  133.         android:layout_width="wrap_content"  
  134.   
  135.         android:layout_height="wrap_content"/>  
  136.   
  137.     <Button    
  138.   
  139.         android:id="@+id/wave"  
  140.   
  141.         android:textSize="20sp"  
  142.   
  143.         android:layout_width="wrap_content"  
  144.   
  145.         android:layout_height="wrap_content"  
  146.   
  147.         android:text="产生波形"/>"   
  148.   
  149.     </LinearLayout>  
  150.   
  151.     <com.kernel.minthen.SineWave  
  152.   
  153.         android:layout_width="match_parent"  
  154.   
  155.         android:layout_height="match_parent">         
  156.   
  157.     </com.kernel.minthen.SineWave>  
  158.   
  159.            
  160.   
  161. </LinearLayout>  

       备注:com.kernel.minthen.SineWave系自己写的产生正弦波的类。

       2. src下的SineWave.java文件,用于根据幅度、频率和相位设置产生正弦波,代码如下:

Java代码
  1. package com.kernel.minthen;   
  2.   
  3.     
  4.   
  5. import android.content.Context;   
  6.   
  7. import android.graphics.Canvas;   
  8.   
  9. import android.graphics.Color;   
  10.   
  11. import android.graphics.Paint;   
  12.   
  13. import android.graphics.Path;   
  14.   
  15. import android.util.AttributeSet;   
  16.   
  17. import android.view.MotionEvent;   
  18.   
  19. import android.view.View;   
  20.   
  21.     
  22.   
  23. import java.lang.Math;   
  24.   
  25.     
  26.   
  27. public class SineWave extends View implements Runnable{   
  28.   
  29.     private  Paint mPaint = null;   
  30.   
  31.     private  static float amplifier = 100.0f;   
  32.   
  33.     private  static float frequency = 2.0f;    //2Hz   
  34.   
  35.     private  static float phase = 45.0f;         //相位    
  36.   
  37.     private  int height = 0;   
  38.   
  39.     private  int width = 0;   
  40.   
  41.     private  static float px=-1,py=-1;   
  42.   
  43.     private  boolean sp=false;   
  44.   
  45.        
  46.   
  47.     public SineWave(Context context){   
  48.   
  49.        super(context);   
  50.   
  51.        mPaint = new Paint();   
  52.   
  53.        new Thread(this).start();          
  54.   
  55.     }   
  56.   
  57.     //如果不写下面的构造函数,则会报错:custom view SineWave is not using the 2- or 3-argument View constructors   
  58.   
  59.     public SineWave(Context context, AttributeSet attrs){   
  60.   
  61.        super(context,attrs);   
  62.   
  63.        mPaint = new Paint();   
  64.   
  65.        new Thread(this).start();      
  66.   
  67.     }   
  68.   
  69.     public SineWave(Context context,float amplifier,float frequency,float phase){   
  70.   
  71.        super(context);   
  72.   
  73.        this.frequency = frequency;   
  74.   
  75.        this.amplifier = amplifier;   
  76.   
  77.        this.phase     = phase;   
  78.   
  79.        mPaint = new Paint();   
  80.   
  81.        new Thread(this).start();   
  82.   
  83.     }   
  84.   
  85.     public float GetAmplifier(){   
  86.   
  87.        return amplifier;   
  88.   
  89.     }   
  90.   
  91.     public float GetFrequency(){   
  92.   
  93.        return frequency;   
  94.   
  95.     }   
  96.   
  97.     public float GetPhase(){   
  98.   
  99.        return phase;   
  100.   
  101.     }   
  102.   
  103.     public void Set(float amplifier,float frequency,float phase){   
  104.   
  105.     this.frequency = frequency;   
  106.   
  107.        this.amplifier = amplifier;   
  108.   
  109.        this.phase     = phase;   
  110.   
  111.     }   
  112.   
  113.     public void SetXY(float px,float py)   
  114.   
  115.     {   
  116.   
  117.     this.px = px;   
  118.   
  119.     this.py = py;   
  120.   
  121.     }   
  122.   
  123.     public void onDraw(Canvas canvas){   
  124.   
  125.        super.onDraw(canvas);   
  126.   
  127.        canvas.drawColor(Color.WHITE);   
  128.   
  129.        height = this.getHeight();   
  130.   
  131.        width  = this.getWidth();   
  132.   
  133.        mPaint.setAntiAlias(true);   
  134.   
  135.        mPaint.setColor(Color.GREEN);   
  136.   
  137.        amplifier = (amplifier*2>height)?(height/2):amplifier;   
  138.   
  139.        mPaint.setAlpha(200);   
  140.   
  141.        mPaint.setStrokeWidth(5);   
  142.   
  143.        float cy = height/2;   
  144.   
  145.        //float py=this.py-this.getTop();   
  146.   
  147.        for(int i=0;i<width-1;i++)   
  148.   
  149.        {   
  150.   
  151.            canvas.drawLine((float)i, cy-amplifier*(float)(Math.sin(phase*2*(float)Math.PI/360.0f+2*Math.PI*frequency*i/width)), (float)(i+1), cy-amplifier*(float)(Math.sin(phase*2*(float)Math.PI/360.0f+2*Math.PI*frequency*(i+1)/width)), mPaint);   
  152.   
  153.            float point = cy-amplifier*(float)(Math.sin(phase*2*(float)Math.PI/360.0f+2*Math.PI*frequency*i/width));   
  154.   
  155.            if((py>=(point-2.5f))&&(py<=(point+2.5f))&&(px>=i-2.5f)&&(px<=i+2.5f))   
  156.   
  157.               sp = true;   
  158.   
  159.        }         
  160.   
  161.        if(sp)   
  162.   
  163.        {   
  164.   
  165.            mPaint.setColor(Color.RED);   
  166.   
  167.            mPaint.setTextSize(20);   
  168.   
  169.            canvas.drawText("(x="+Float.toString(px)+",y="+Float.toString(py)+")"2020, mPaint);             
  170.   
  171.            sp = false;   
  172.   
  173.        }         
  174.   
  175.        mPaint.setColor(Color.BLUE);   
  176.   
  177.        mPaint.setTextSize(20);   
  178.   
  179.        canvas.drawText("(x="+Float.toString(px)+",y="+Float.toString(py)+")"20this.getHeight()-20, mPaint);   
  180.   
  181.     }   
  182.   
  183.        
  184.   
  185.     @Override  
  186.   
  187.     public boolean onTouchEvent(MotionEvent event) {   
  188.   
  189.        // TODO Auto-generated method stub   
  190.   
  191.        float px = event.getX();   
  192.   
  193.        float py = event.getY();   
  194.   
  195.        this.SetXY(px, py);   
  196.   
  197.        return super.onTouchEvent(event);   
  198.   
  199.     }   
  200.   
  201.     @Override  
  202.   
  203.     public void run() {   
  204.   
  205.        // TODO Auto-generated method stub   
  206.   
  207.        while(!Thread.currentThread().isInterrupted())   
  208.   
  209.        {   
  210.   
  211.            try{   
  212.   
  213.               Thread.sleep(1000);   
  214.   
  215.            }catch(InterruptedException e)   
  216.   
  217.            {   
  218.   
  219.               Thread.currentThread().interrupt();   
  220.   
  221.            }   
  222.   
  223.            postInvalidate();   
  224.   
  225.        }   
  226.   
  227.     }   
  228.   
  229.        
  230.   
  231. }  

       3. src下主Activity文件mySine.java,代码如下:

Java代码
  1. package com.kernel.minthen;   
  2.   
  3.     
  4.   
  5. import android.app.Activity;   
  6.   
  7. import android.os.Bundle;   
  8.   
  9. import android.view.MotionEvent;   
  10.   
  11. import android.view.View;   
  12.   
  13. import android.widget.Button;   
  14.   
  15. import android.widget.TextView;   
  16.   
  17.     
  18.   
  19. public class mySine extends Activity{   
  20.   
  21.     private TextView frequency=null;   
  22.   
  23.     private TextView phase=null;   
  24.   
  25.     private TextView amplifier=null;   
  26.   
  27.     private Button   btnwave=null;   
  28.   
  29.     SineWave sw=null;   
  30.   
  31.        @Override  
  32.   
  33.        protected void onCreate(Bundle savedInstanceState) {   
  34.   
  35.               super.onCreate(savedInstanceState);   
  36.   
  37.               sw = new SineWave(this);   
  38.   
  39.               setContentView(R.layout.main);   
  40.   
  41.     
  42.   
  43.               btnwave = (Button)findViewById(R.id.wave);   
  44.   
  45.               frequency = (TextView)findViewById(R.id.frequency);   
  46.   
  47.               phase = (TextView)findViewById(R.id.phase);   
  48.   
  49.               amplifier = (TextView)findViewById(R.id.amplifier);   
  50.   
  51.                  
  52.   
  53.                  
  54.   
  55.               btnwave.setOnClickListener(new Button.OnClickListener(){   
  56.   
  57.     
  58.   
  59.                      @Override  
  60.   
  61.                      public void onClick(View arg0) {   
  62.   
  63.                             // TODO Auto-generated method stub   
  64.   
  65.                             sw.Set(Float.parseFloat(amplifier.getText().toString()), Float.parseFloat(frequency.getText().toString()), Float.parseFloat(phase.getText().toString()));   
  66.   
  67.                      }   
  68.   
  69.               });   
  70.   
  71.        }   
  72.   
  73.           
  74.   
  75.        @Override  
  76.   
  77.        protected void onStart() {   
  78.   
  79.               // TODO Auto-generated method stub   
  80.   
  81.               super.onStart();   
  82.   
  83.               frequency.setText(Float.toString(sw.GetFrequency()));   
  84.   
  85.               phase.setText(Float.toString(sw.GetPhase()));   
  86.   
  87.               amplifier.setText(Float.toString(sw.GetAmplifier()));   
  88.   
  89.        }   
  90.   
  91.     
  92.   
  93.        @Override  
  94.   
  95.        public boolean onTouchEvent(MotionEvent event) {   
  96.   
  97.               // TODO Auto-generated method stub   
  98.   
  99.               //float px = event.getX();   
  100.   
  101.               //float py = event.getY();   
  102.   
  103.               //sw.SetXY(px, py);   
  104.   
  105.               return super.onTouchEvent(event);   
  106.   
  107.        }   
  108.   
  109. }  

       到此,正弦波的Android开发实例就讲完了,希望大家能从这个简单的例子中得到启发。

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/example/122.html
2012年7月21日
发布:鸡啄米 分类:Android开发实例 浏览: 评论:1