将变量从 Activity 传递到自定义视图类

2024-03-26

我正在测试使用将音频绘制到画布中canvas.drawLine()方法。我能够在画布上进行静态绘制。基本上我有一个测试应用程序,它有两个按钮“开始”和“停止”和一个画布,我试图在其中绘制从 FFT 获得的音频频率。当我按下开始按钮时,它开始使用录制声音AudioRecord类并将数据收集到缓冲区中,我通过 FFT 运行该缓冲区来获取频率。这还处于非常早期的阶段。现在我只是想弄清楚如何将这些频率值传递给onDraw我的自定义视图类的方法。以下是从布局开始的相关代码。

活动_main.xml

<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=".MainActivity" >

    <com.example.testapp.WaveForm
        android:id="@+id/waveForm1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="78dp" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_alignRight="@+id/waveForm1"
        android:layout_marginRight="19dp"
        android:text="STOP" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/waveForm1"
        android:layout_alignParentTop="true"
        android:text="START" />

</RelativeLayout>

我认为这非常简单。这是我的自定义视图类

波形.java

package com.example.testapp;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class WaveForm extends View {

    private Paint mLinePaint;
    float x ;
    float y;

    public WaveForm(Context context, AttributeSet attrs) {
        super(context, attrs);
        mLinePaint = new Paint();
        mLinePaint.setStyle(Paint.Style.STROKE);
        mLinePaint.setARGB(255, 0, 0, 255);
        mLinePaint.setAntiAlias(true);
        mLinePaint.setStrokeWidth(10);
        x = 0.0f;
        y = 0.0f;

    }

    @Override
    protected void onDraw(Canvas canvas) {
        //Instead of 50 here i would like to pass the value obtained from the Activity class
        canvas.drawLine(x, 0, y, 50, mLinePaint);   
        y = y + 1.0f;
        x = x + 1.0f;
        super.onDraw(canvas);
    }



}

正如我在 onDraw 方法的注释中提到的,我想传递在 Activity 中获得的频率值而不是 50。 最后这是我的活动:

MainActivity.java

package com.example.testapp;


import android.app.Activity;
import android.graphics.Canvas;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder.AudioSource;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;



public class MainActivity extends Activity {
    boolean recording = false;
    AudioRecord audioRecord;
    double[] x;
    double[] y;
    double currentPoint = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final View myInstance = (View) findViewById(R.id.waveForm1);

        Button start = (Button) findViewById(R.id.button1);
        start.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            int sampleRateInHz=44100;
            int channelConfig = AudioFormat.CHANNEL_IN_MONO;
            int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, AudioFormat.ENCODING_PCM_16BIT);
            audioRecord = new AudioRecord(AudioSource.MIC, sampleRateInHz, channelConfig, AudioFormat.ENCODING_PCM_16BIT,  AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, AudioFormat.ENCODING_PCM_16BIT));
            byte[] audioData = new byte[bufferSizeInBytes/4];

            FFT myFFT = new FFT(audioData.length);
            Canvas canvas = new Canvas();
            recording = true;
            audioRecord.startRecording();
            while(recording) {
            audioRecord.read(audioData,0, bufferSizeInBytes/4);
            //convert to double here
            for(int i=0; i<audioData.length; i++) {
                x[i] = (double)audioData[i];
                y[i] = 0;
            }
            double[] samples = myFFT.fft(x, y);
            for(int i=0; i<samples.length; i++) {
                currentPoint = samples[i];
                myInstance.draw(canvas);
                myInstance.invalidate();
            }
            }

        }
        });
        Button stop = (Button) findViewById(R.id.button2);
        stop.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
        recording = false;
        audioRecord.stop();

        }
        });     
    }     
}

The currentPoint变量是我试图传递给onDraw方法。预先感谢您的浏览。


为以下对象创建 Getter/SettercurrentPoint内部变量WaveForm从中获取价值MainActivity打电话之前draw as:

public class WaveForm extends View {

    private double currentPoint = 50;
    public void setCurrentPoint(double currentPoint){
         this.currentPoint=currentPoint;
    }
    public double getCurrentPoint(){

       return this.currentPoint;
    }
    @Override
    protected void onDraw(Canvas canvas) {

        canvas.drawLine(x, 0, y, getCurrentPoint(), mLinePaint);   
        ...
    }

}

和来自MainActivity set currentPoint通过调用值setCurrentPoint调用之前的方法onDraw:

    for(int i=0; i<samples.length; i++) {
        currentPoint = samples[i];
        myInstance.setCurrentPoint(currentPoint);
        myInstance.draw(canvas);
        myInstance.invalidate();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将变量从 Activity 传递到自定义视图类 的相关文章

  • “找不到符号”或“无法解析符号”错误是什么意思?

    请解释以下有关 找不到符号 无法解析符号 或 找不到符号 错误 Java 中 的信息 他们的意思是什么 哪些因素会导致它们 程序员如何修复它们 这个问题旨在对 Java 中的这些常见编译错误进行全面的问答 0 这些错误之间有什么区别吗 并不
  • java.lang.NullPointerException:Android尝试调用虚拟方法错误

    我的 android webview 片段应用程序崩溃了 在我添加了一个按钮从一个片段转到另一个片段后 控制台上的错误是 E AndroidRuntime FATAL EXCEPTION main Process com ahmed sto
  • Spring数据异常处理

    我正在使用 Spring Data JPA 开发一个项目 我需要处理 JpaRepository 方法调用中的一些异常 在下面的代码中 我需要拦截主键违规错误 但无法直接捕获异常 就我而言 当发生此类异常时 存储库层 JpaReposito
  • 如何使用 Java 以编程方式登录 Facebook?

    我正在尝试编写一个可以自动登录 Facebook 的 Java 程序 到目前为止 我已经得到了以下代码 可以将主页 html 页面下载到字符串中 但不知道如何发送电子邮件和密码来登录 Facebook Java 程序还需要处理返回的 coo
  • 动态添加组件到 JDialog

    当用户单击 JDialog 上的按钮时 我在将组件添加到 JDialog 时遇到问题 基本上我希望它看起来像这样 然后 当用户单击 添加新字段 时 我希望它看起来像这样 我似乎无法打开添加新 JLabel 或 JTextField 的对话框
  • Android studio 3.0 Canary 6 执行com.android.build.gradle.tasks.MergeResources$FileGenerationWorkAction时发生失败

    一切都很好 直到我将 android studio 更新到 Canary 6 当我重建或清理或其他项目时 它会抛出 执行 com android build gradle tasks MergeResources FileGeneratio
  • 如何在java中将ojalgo稀疏数组存储到文件中?

    我目前有一个 SparseStore 矩阵 我在其中执行大量计数和计算 我想将其存储到文件中 以便以后可以重复使用它 而无需重新执行之前的所有计算 我尝试了 Java 中的基本序列化 ObjectOutputStream outputStr
  • 滚动文件实现

    我一直很好奇滚动文件是如何在日志中实现的 如何开始用任何语言创建一个文件写入类 以确保不超过文件大小 我能想到的唯一可能的解决方案是 write method size file size size of string to write i
  • 在 Android 中 - 如何使用 ClickableSpan 只注册长点击

    我想注册对包含在 ClickableSpan 中的文本的点击 前提是点击时间超过 1 秒 有什么办法可以做到这一点吗 如果没有 捕获双击也可以 如果 onClick 方法捕获了一个包含有关点击的一些元数据的事件 那就太好了 那么如果点击长度
  • 将 TextField 与 LibGDX 结合使用

    我正在使用 LibGDX 开发一款 Android 游戏 并且想要实现两个TextFields 登录到服务器 据我所知我需要使用Stage https libgdx badlogicgames com nightlies docs api
  • Android 中的 EditText onClickListener

    我想要一个 EditText 它在按下时创建一个 DatePicker 所以我写了下面的代码 mEditInit EditText findViewById R id date init mEditInit setOnClickListen
  • 使用 getPathMatcher 的全局模式

    从 OCP 考试的 Kathy Sierra Bert Bates 书中我找到了以下代码 public class FileTest public static void matches Path path String glob Path
  • Spring MVC - 两次提供内容

    我已经花了一周时间寻找有关如何将内容服务器到我的网页的指导 两次 因为使用 Model 或 ModelAndView 切断内容一次可以工作 但如果用户再次与页面交互 我希望它加载更多内容同一页 Java Spring 后端方法 Get 有效
  • Android 中的 RoboSpice 库是什么

    我正在尝试了解 android 中的 RoboSpice 库 我在这里看到了在线文档 https github com stephanenicolas robospice wiki Starter Guide 我尝试过什么 我之前研究过使用
  • 有没有办法在坐标平面上动态绘制点之间的线?

    我正在完成一个项目 在该项目中我实现了一个暴力算法来解决凸包问题 我还需要为该算法创建视觉效果 我试图在 x 轴和 y 轴上创建一个范围从 100 100 的坐标平面 绘制完整集中的所有点 并在点之间动态绘制线条以创建凸包 例如 假设我有
  • 主屏幕活动快捷方式

    我有 2 项活动 1 主要活动 2 第二个活动 我希望创建第二个活动的主屏幕快捷方式 Intent shortcutIntent new Intent getApplicationContext SecondActivity class s
  • Android - 深色模式问题:深色背景上的黑色文本

    当我启用深色模式时 我的应用程序上的某些菜单看起来很糟糕 非常暗的背景上的黑色文本 我对颜色完全是一个初学者 我还没有接触过 android studio 上默认颜色设置的任何内容 所以我有默认的两个主题 XML 和 Color Xml
  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc
  • 更改工具栏中的标题颜色?

    我有一个使用的工具栏 并设置标题 ActionBarActivity getActivity getSupportActionBar setTitle Home 有没有办法将颜色从黑色更改为白色 我尝试制作自己的主题并将其设置在 xml 中
  • Firebase 事件未从 Android 服务记录

    我的 Android 应用程序中有一个音乐流媒体服务 我试图使用 Fire base 事件日志记录流媒体音乐 我相应地实现了所有内容 我可以从我的活动中看到事件 但不能从我的服务中看到事件 我是否遗漏了某些内容 或者 firebase 不支

随机推荐