2014-10-31 82 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); 
     } 
    } 
}