Android应用程序开发...用声音显示图像几秒钟(不是飞溅)

时间:2014-05-19 19:24:22

标签: android image

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

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();
    }
}
}

1 个答案:

答案 0 :(得分:0)

我在这里问了一个类似的问题,关于如何使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

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

希望这有帮助!

EDIT

<小时/> 使用方法:

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

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

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

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

希望这适合你!

修改


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

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

    • 在实际的XML代码中编辑位置。
  2. 如果你进入ImageView的XML代码,你会看到一行说:     机器人:layout_marginLeft =&#34;东西&#34;

    如果你更换了某些东西&#39;使用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行大小并放置您的对象。使用高度和边距等,您应该能够将它放在您想要的位置。

    • 更改布局

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

    android:layout_toRightOf="myTextView"
    

    但是,如果您的屏幕上有许多项目,这只会有效。

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

    有几个可能的原因。

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

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

    • 有些东西阻止它立即运行(例如,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,您应该准备好了。如果使用margin方法(在java代码中),您应该能够创建一个简单的算法来根据给定的坐标计算边距大小。

    希望也有效!