【问题标题】:Android - Drawing simple sine wave on SurfaceViewAndroid - 在 SurfaceView 上绘制简单的正弦波
【发布时间】:2013-05-30 03:18:47
【问题描述】:

我有一个带有视图的活动,其中包含一些 UI 元素,如滑块、一些 textView 和一个 surfaceView。我想在surfaceView上画一个简单的正弦波,但我不知道怎么做。我能找到的教程并没有解决我的问题。

所以基本上,如何在我的 xml 布局文件中定义的 surfaceView 上绘制正弦波?

【问题讨论】:

    标签: android xml drawing surfaceview


    【解决方案1】:

    要在 SurfaceView 上绘图,您需要编写自己的扩展 SurfaceView 的类。在您的 XML 布局文件中使用此类。然后你必须覆盖onDraw(Canvas canvas) 来进行绘图。使用Math.sin(double a)获取鼻窦。

    【讨论】:

      【解决方案2】:

      好的,这是一种在 Surface View 上绘制正弦的简单有趣的方法。当然,这一切都是以错误的方式完成的,但它很好地说明了原理。

      我知道 Google 对退出按钮的看法,我 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>
      

      【讨论】:

      • 特别是我不支持在 Android 中需要“退出按钮”。但重要的是,这个例子很完美!您的小而实用的示例是我需要在没有大型和繁重的库的情况下绘制简单图形的起点。 (t.h.a.n.k.s.!)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多