2014-10-31 87 views
0

我正在製作一個看起來像下面的圖片的應用程序,底部的諧波不會改變,但最上面的諧波會通過設置幅度,歐米加,歐米茄逆和phi。繪畫諧波Android

enter image description here

我有X和Y線,但我似乎無法弄清楚如何,甚至畫的底波,Y = SIN(X)。我已經搜索並嘗試去做,但都失敗了。任何人都可以幫助或指導一個有用的資源嗎?

+0

你是怎麼畫的頂部嗎?應該是一樣的,但是有一個y偏移量。 – 2014-10-31 01:00:03

+0

我沒有畫出波浪,這就是我想要做的 – user1314413 2014-10-31 01:01:22

+0

看看傳統sdk示例中的傳感器/加速度計的東西,以獲得一個想法。 – 2014-10-31 01:04:55

回答

0

這是一個繪製兩個正弦波的簡單示例,考慮了視圖尺寸變化,一些軸縮放和模擬步進。


<com.pixdart.view.HarmonicCustomView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#DDD"/> 
public class HarmonicCustomView extends View { 

    private Paint mPaint = new Paint(); 
    private RectF mRectF = new RectF(); 
    private float scaleY, scaleX; 
    public static final float STEP_X = 0.1f; 
    public static final int PERIODS_TO_SHOW = 5; 

    public HarmonicCustomView(Context context) { 
     super(context); 
     initialize(); 
    } 

    public HarmonicCustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initialize(); 
    } 

    public HarmonicCustomView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     initialize(); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     mRectF.set(0, 0, w, h); 
     mRectF.inset(mRectF.width() * 0.1f, mRectF.height() * 0.1f); 
     scaleX = (float) (2 * Math.PI * PERIODS_TO_SHOW/mRectF.width()); 
     scaleY = mRectF.height()/6; 
    } 

    public void initialize() { 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeWidth(2f); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     mPaint.setColor(0xFFFF0000); 
     for (float x = 0; x < mRectF.width(); x += STEP_X) { 
      float y = (float) (Math.sin(x * scaleX)) * scaleY; 
      canvas.drawPoint(x + mRectF.left, y + mRectF.top + scaleY, mPaint); 
     } 

     mPaint.setColor(0xFF0000FF); 
     for (float x = 0; x < mRectF.width(); x += STEP_X) { 
      float y = (float) (Math.sin(x * scaleX)) * scaleY; 
      canvas.drawPoint(x + mRectF.left, y + mRectF.top + scaleY * 5, mPaint); 
     } 
    } 
}