【问题标题】:Android application development ... Displaying a image for few seconds with sound (not splash)Android 应用程序开发... 用声音显示图像几秒钟(不是飞溅)
【发布时间】:2014-05-19 19:24:21
【问题描述】:

谁能告诉我如何才能显示带有声音的图像...我想在播放声音时显示图像几秒钟...我是新手,无法弄清楚。我可以单独获取图像或声音,但不能两者结合。

enter code here

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;

public class GunBlood extends Activity implements OnClickListener,
    OnLongClickListener {
Disp d;
SoundPool sp, sp2;
float y = 0, x = 0;
int ex = 0, sg = 0, f = 0;
Bitmap blood;
Canvas canvas;
View v;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    d = new Disp(this);
    v= new View(this);
    setContentView(d);
    d.setOnClickListener(this);
    d.setOnLongClickListener(this);
    blood = BitmapFactory.decodeResource(getResources(), R.drawable.blood);
    sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
    ex = sp.load(this, R.raw.gun, 1);
    sp2 = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
    sg = sp2.load(this, R.raw.sgun, 1);
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if (ex != 0) {
        if (f == 0)
            sp.play(ex, 1, 1, 0, 0, 1);
        f = 0;
    }
    x = v.getX();
    y = v.getY();
    }

@Override
public boolean onLongClick(View v) {
    // TODO Auto-generated method stub
    if (sg != 0)
        sp2.play(ex, 1, 1, 0, 0, 1);
    f = 1;
    return false;
}

public class Disp extends View {

    public Disp(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);

        if (x != 0 && y != 0) {
            canvas.drawBitmap(blood, (blood.getWidth() / 2),
                    (blood.getHeight() / 2), null);
        }

        invalidate();
    }
}
}

【问题讨论】:

    标签: android image


    【解决方案1】:

    我在这里问了一个类似的问题,关于如何使 ImageView 不可见然后可见,这也许可以应用。

    您可以使用它在一定时间后执行一段代码:

    blood.setVisibility(View.VISIBLE); //make the image invisible
    blood.postDelayed(new Runnable() {
        @Override
        public void run() {
             blood.setVisibility(View.INVISIBLE); //make the image visible
        }
    }, 3000); //the 3000 is the amount of milliseconds until the code executes, so 3 seconds. 
    
    sp.play(ex, 1, 1, 0, 0, 1);
    sp.postDelayed(new Runnable() {
        @Override
        public void run() {
          if (sg != 0)
            sp.stop()//I have no idea if this is the right code, I'm not very familiar with SoundPool
            f = 1;
          }
    }, 3000);
    

    我不确定这两个 postDelayed 方法是否会同时运行,或者一个会延迟另一个,尽管我认为它们会同时运行。

    您还可以为图像使用动画,为声音使用 postDelayed。 Xyresic 在回答我的问题时很好地描述了动画方面,链接如下。

    我问的问题是Pause Between Making ImageView Invisible and Visible Android

    如果我在这里有什么问题或者可以改进,请告诉我。我也是一个初学者,还在学习。我很乐意接受更正。

    希望这会有所帮助!

    编辑


    利用:
    android:Clickable="true"
    android:onClick="methodYouWantCalled"
    

    在您的按钮或任何对象的 XML 文件中,它将转到以该 XML 文件作为其布局的类文件中的该方法。只要确保方法是

    public static void methodYouWantCalled(View view){
    //code here
    }
    

    它需要在参数中有 View 视图并且它需要是公共的。

    希望这对你有用!

    编辑


    因此,接下来的两个问题是图像始终显示在屏幕顶部,并且在加载图片时存在明显延迟。

    1. 如果图像始终显示在左上角,则您可以在布局中移动图像,或切换布局。我假设您在 Eclipse 中使用 Android SDK。您可以做的是转到您的 XML 文件,然后按“图形布局”。在那里,您可以将图像拖到您想要的位置。我相信在 XML 中编辑对象的位置更容易,并且不太可能出现任何错误。如果将图像在屏幕上拖动到您想要的位置不起作用,或者它弄乱了您放置其他东西的位置,您可以尝试以下一些方法。

      • 在实际 XML 代码中编辑展示位置。

    如果您进入 ImageView 的 XML 代码,您应该会看到一行内容: android:layout_marginLeft="某事"

    如果您将“某物”替换为诸如 200dp(密度像素,每个设备相同)之类的值,您可以将其移动到您想要的任何位置。您可以使用 marginLeft、marginRight、marginBottom 和 marginTop 来做到这一点。如果您使用密度像素,您应该能够将它放在正确的位置。这是一个例子。

    XML

    <!--Up here is all the basic stuff like the id. I am just making up these values -->
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:layout_marginLeft="200dp"
    android:layout_marginBottom="600dp"
    android:Clickable="true"
    android:onClick="methodToBeCalled"
    

    前 4 行的大小和放置对象。使用高度和边距等,您应该能够将其放置在您想要的位置。

    • 更改布局

    如果屏幕上有很多东西,您可以更改为相对布局,并让它们彼此对应放置。所以说你有一个 TextView,左上角有一个 id 为 myTextView 的 TextView。然后,您可以使用相对布局,将您的图片放置在该图片的右侧:

    android:layout_toRightOf="myTextView"
    

    这只有在屏幕上有很多项目时才有效。

    2) 我不确定您的图片需要一段时间才能加载,但我可以试一试。

    有几个可能的原因。

    • 这是一个大文件,需要时间处理(单张图片不太可能)

    • 该应用同时执行多项操作,并且正在耗尽所有手机的 RAM(不太可能,因为这听起来像是一个相对简单的应用)

    • 某些东西阻止它立即运行(例如,Thread.sleep(); 命令。)

    所有问题都有解决方案,但难度各不相同。

    对于第一个可能的问题,您可以通过在启动活动期间或在活动之前的加载屏幕中预加载资源来控制加载时间。有一个很好的教程here

    对于第二个可能的问题,您需要最小化正在处理的内容,以便为主要任务提供更多 RAM。我几乎没有这方面的经验,所以我无法真正帮助你。但是,这是极不可能的,因为手机具有如此强大的处理能力。

    对于最后可能出现的问题,您只需要确保您的应用程序中没有类似的东西。我回避他们,因为我真的不喜欢使用线程。您可以尝试使用 postDelayed 代替。

    希望它有效!如果您遇到任何问题,请发表评论。

    编辑


    我发现了一些关于此的其他 Stack Overflow 帖子,即 Android - setting X,Y of image programmaticallyandroid sdk set imageview x y coordinates。唯一的问题是我不确定 AbsouluteLayout 是否仍然只是折旧或消失了。无论哪种方式,它都应该在完全移除后更换,您可以使用替代品。我相信它仍然只是贬值,所以我们应该可以使用它。我喜欢你获取 x 和 y 并使用它们的想法,我们仍然可以这样做。查看这些帖子以及Android setX() and setY() behaving weird,您应该准备好了。如果您使用边距方法(在 java 代码中),您应该能够创建一个简单的算法来根据您给定的坐标计算边距大小。

    希望这也有效!

    【讨论】:

    • 我现在已经为图像视图设置了血液而不是位图。我已经将内容视图设置为包含图像视图的新 xml 文件。现在的问题是我不能使用 onclicklisteners 因为他们需要 setcontent 视图与 v.
    • 案例 1:因此,如果我将 contentView 设置为带有 imageview 的 xml 文件,我可以看到图像但无法通过 onclicklisteners 播放声音。案例 2:如果我将 contentView 设置为视图,我可以播放声音,但我不能引用 imageview 或应用程序崩溃。
    • 不要使用 onclick 监听器,而是在你的 XML 文件中使用 android:onClick="methodName",这样当按钮被点击时,它会调用 methodName 方法。把你想要执行的所有代码放在那里。只要确保 methodName 是公开的。
    • 我在原始答案中添加了更多信息
    • 是的,它确实有点工作......谢谢:) 但如果你能提供帮助,我还有两个相关的问题。问题 1:图像始终显示在屏幕的左上角,但我希望它显示在触摸点处。我打算使用以下代码 x = v.getX(); y = v.getY();血液.setX(x);血液.setY(y);但这不适用于自定义方法。我可以通过任何其他方式在首选地点获得它。
    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多