Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改循环上的位图图像_Java_Android_Bitmap - Fatal编程技术网

Java 更改循环上的位图图像

Java 更改循环上的位图图像,java,android,bitmap,Java,Android,Bitmap,我有一个画布,我希望每50毫秒更改一次位图图像 基本上我想做的是一个gif动画 如你所见,有4个图像,每50毫秒我希望它改变图像 下面的代码不起作用,我不知道为什么 protected void onDraw(final Canvas canvas) { res = getResources(); image = BitmapFactory.decodeResource(res, R.drawable.image_1); canvas.drawBitmap(image,

我有一个画布,我希望每50毫秒更改一次位图图像

基本上我想做的是一个gif动画

如你所见,有4个图像,每50毫秒我希望它改变图像

下面的代码不起作用,我不知道为什么

protected void onDraw(final Canvas canvas) {

    res = getResources();
    image = BitmapFactory.decodeResource(res, R.drawable.image_1);
    canvas.drawBitmap(image, 0, 0, paint);

    new Thread(new Runnable() {

        @Override
        public void run() {
            while (!Thread.interrupted())
                try {
                    Thread.sleep(50);
                    System.out.println("OK2");

                    time++;
                    ((Activity) context).runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            if (time == 1) {

                                image = BitmapFactory.decodeResource(res,
                                        R.drawable.image_1);

                                canvas.drawBitmap(image, 0, 0, paint);
                                invalidate();
                            }
                            if (time == 2) {
                                image = BitmapFactory.decodeResource(res,
                                        R.drawable.image_2);

                                canvas.drawBitmap(image, 0, 0, paint);
                                invalidate();

                            }

                            if (time == 3) {
                                image = BitmapFactory.decodeResource(res,
                                        R.drawable.image_3);

                                canvas.drawBitmap(image, 0, 0, paint);
                                invalidate();

                            }

                            if (time >= 4) {

                                time = 0;
                                image = BitmapFactory.decodeResource(res,
                                        R.drawable.image_4);
                                canvas.drawBitmap(image, 0, 0, paint);
                                invalidate();

                            }
                        }
                    });
                } catch (InterruptedException e) {

                }
        }

    }).start();
    super.onDraw(canvas);

}

提前感谢。

有几个问题:

您每次都在反复解码资源<代码>解码资源可能不够快,无法在50毫秒内加载图像。将帧解码一次并将其存储在阵列中会更快。e、 g:

Bitmap images[4];
void loadFrames()
{
    res = getResources();
    images[0] = BitmapFactory.decodeResource(res, R.drawable.image_1);
    images[1] = BitmapFactory.decodeResource(res, R.drawable.image_2);
    images[2] = BitmapFactory.decodeResource(res, R.drawable.image_3);
    images[3] = BitmapFactory.decodeResource(res, R.drawable.image_4);
}
每次调用
onDraw()
时,您都会启动一个新线程,这意味着将创建数百个线程。相反,您应该只创建一次线程。在线程内部,增加计数器并将
image
设置为正确的帧,然后调用invalidate:

 Thread.sleep(50);
 time = (time + 1) % 4;
 image = images[time];
 ((Activity) context).runOnUiThread(new Runnable() {
      @Override
      public void run() {
          invalidate();
      }
 };
然后在
onDraw()
中,使用当前图像绘制到画布上:

 canvas.drawBitmap(image, 0, 0, paint);
你可以使用这个链接。这是用于滑动图像的

    public void imageSlider(){
    HashMap<String,Integer> file_maps = new HashMap<String, Integer>();
    file_maps.put("Palava Titans - Lodha Palava, Dombivali",R.drawable.img1);
    file_maps.put("Dribble Football -Imax, Wadala",R.drawable.img2);
    file_maps.put("Astro Park - Atria, Worli",R.drawable.img3);
    file_maps.put("TigerPlay - Citimall, Andheri w", R.drawable.img4);
    file_maps.put("DSF - Ryan International, Andheri", R.drawable.img5);
    file_maps.put("The Arena, Sakinaka", R.drawable.img6);
    file_maps.put("Astro Park - Smash, Lower Parel", R.drawable.img7);
    file_maps.put("DSF - Rcity, Ghatkopar", R.drawable.img8);
    file_maps.put("Father Agnel - Vashi", R.drawable.img9);
    file_maps.put("Footbrawl - Milan Subway", R.drawable.img10);

    for(String name : file_maps.keySet()){
        TextSliderView textSliderView = new TextSliderView(this);
        // initialize a SliderLayout
        textSliderView
        .description(name)
        .image(file_maps.get(name))
        .setScaleType(BaseSliderView.ScaleType.Fit);
        //add your extra information
        textSliderView.getBundle()
        .putString("extra",name);

        mDemoSlider.addSlider(textSliderView);
    }
    mDemoSlider.setPresetTransformer(SliderLayout.Transformer.Accordion);
    mDemoSlider.setPresetIndicator(SliderLayout.PresetIndicators.Right_Bottom);
    mDemoSlider.setCustomAnimation(new DescriptionAnimation());
    mDemoSlider.setDuration(5000);
}
public void imageSlider(){
HashMap文件_maps=新HashMap();
文件_maps.put(“Palava Titans-Lodha Palava,Dombivali”,R.drawable.img1);
文件_maps.put(“运球足球-Imax,Wadala”,R.drawable.img2);
文件_maps.put(“Astro Park-Atria,Worli”,R.drawable.img3);
文件_maps.put(“TigerPlay-Citimall,Andheri w”,R.drawable.img4);
文件_maps.put(“DSF-Ryan International,Andheri”,R.drawable.img5);
文件_maps.put(“Sakinaka竞技场”,R.drawable.img6);
文件_maps.put(“Astro Park-Smash,Lower Parel”,R.drawable.img7);
文件_maps.put(“DSF-Rcity,Ghatkopar”,R.drawable.img8);
文件_maps.put(“Agnel-Vashi神父”,R.drawable.img9);
文件_maps.put(“足球画-米兰地铁”,R.drawable.img10);
for(字符串名称:file_maps.keySet()){
TextSliderView TextSliderView=新的TextSliderView(此);
//初始化幻灯片布局
文本幻灯片视图
.说明(姓名)
.image(文件_maps.get(名称))
.setScaleType(BaseSliderView.ScaleType.Fit);
//添加您的额外信息
textSliderView.getBundle()
.putString(“额外”,名称);
mDemoSlider.addSlider(textSliderView);
}
mDemoSlider.setPresetTransformer(SliderLayout.Transformer.Accordion);
mDemoSlider.setPresetIndicator(SliderLayout.PresetIndicators.右下);
setCustomAnimation(新的DescriptionAnimation());
mdemosider.setDuration(5000);
}

在onCreate方法中调用此函数

您需要解释什么不起作用。非常感谢!它起作用了