如何在ViewFlipper中将视图替换为另一个视图

时间:2012-01-20 09:58:10

标签: android views viewflipper

我的应用包含一个包含更多图片的ViewFlipper。它使用一些动画自动翻转图像。我希望当显示某个图像时,ViewFlipper停止滑动,将图像替换为另一个图像,然后ViewFlipper再次开始翻转。我花了很多时间在这上面,但它没有得到工作。我试图替换视图并添加一个新视图,但应用程序无法正常工作。有没有人使用ViewFlipper?有谁知道如何用新的视图替换视图?

这是我的代码:

vf = (ViewFlipper) findViewById(R.id.details);
vf.setFlipInterval(Integer.valueOf(3 * 1000));

//populate the ViewFlipper with images

vf.setOutAnimation(animFlipOutNext);
vf.setInAnimation(animFlipInNext);
vf.setAutoStart(true);

我使用过的动画:

animFlipInNext = AnimationUtils
                .loadAnimation(this, R.anim.push_left_in);
        animFlipInNext.setDuration(2000);
        animFlipInNext.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                System.out.println("AnimStart- LeftIn" + " Will be displayed "
                        + vf.getDisplayedChild());
                imageName = images.listFiles();

                for (int i = 0; i < imageName.length; i++) {
                    if (vf.getCurrentView().getTag().toString()
                            .equalsIgnoreCase(imageName[i].getName())) {
                        System.out.println("begin  " + imageName[i].getName());
                        vf.stopFlipping();

                    } else
                        System.out.println("NUNUNU");

                }
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                System.out.println("AnimRepeat-LeftIn");
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                System.out.println("Anim end " + vf.getDisplayedChild());
                for (int i = 0; i < imageName.length; i++) {
                    if (vf.getCurrentView().getTag().toString()
                            .equalsIgnoreCase(imageName[i].getName())) {
                        System.out.println("begin  " + imageName[i].getName());
                        videoname = imageName[i].getName().replace("1.jpg", "");
                        System.out.println("VideoName este " + videoname
                                + ".mp4");

                        bitmap = BitmapFactory.decodeFile(Environment
                                .getExternalStorageDirectory()

                        + "/Images" + "/" + "23Video1.jpg");
                        img = new ImageView(getBaseContext());
                        img.setImageBitmap(bitmap);
                        img.setScaleType(ImageView.ScaleType.FIT_XY);
                        int nr = vf.getDisplayedChild();
                        System.out.println("nr view "+nr);

                        vf.removeViewAt(nr);

                        vf.addView(img, nr,new LayoutParams(LayoutParams.FILL_PARENT,
                                LayoutParams.FILL_PARENT));
                        vf.setDisplayedChild(nr);
                        vf.setVisibility(View.VISIBLE);
                        img=null;
                        //vf.setDisplayedChild(nr);

                    }
                }
            }
        });

        animFlipOutNext = AnimationUtils.loadAnimation(this,
                R.anim.push_left_out);
        animFlipOutNext.setDuration(2000);

        animFlipInPrevious = AnimationUtils.loadAnimation(this,
                R.anim.push_right_in);
        animFlipInPrevious.setDuration(2000);

        animFlipOutPrevious = AnimationUtils.loadAnimation(this,
                R.anim.push_right_out);
        animFlipOutPrevious.setDuration(2000);

我尝试替换onAnimationEnd方法上的视图。请帮忙..欢迎任何想法。

2 个答案:

答案 0 :(得分:0)

ViewFlipper有方法showNext和showPrevious,通过它我们可以更改当前显示的子节点,获取当前显示的子节点,使用getDisplayedChild它将返回当前显示的子节点的索引。

只需使用以下方法显示第n个元素:

private void display(int n)
{
    int index=viewFlipper.getDisplayedChild();
    while(n<index)
    {
       viewFlipper.showPrevious();
       index--;
    }
    while(n>index)
    {
         viewFlipper.showNext();
         index++;
    }
}

答案 1 :(得分:0)

我已经像你一样完成了没有动画的问题,只替换了viewflipper。你可以在动画属性上放置不同的动画。放置这种类型的xml布局。

 <ViewFlipper android:id="@+id/vf1" android:layout_height="wrap_content"
            android:layout_width="wrap_content" android:layout_margin="3dp">
            <RelativeLayout android:layout_width="wrap_content"
                android:id="@+id/RLF1" android:background="@drawable/block_purpal"
                android:layout_height="wrap_content">

            </RelativeLayout>
            <RelativeLayout android:layout_width="wrap_content"
                android:id="@+id/RLB1" android:gravity="center" android:background="@drawable/block_purpal"
                android:layout_height="wrap_content">
                <TextView android:layout_width="wrap_content" android:id="@+id/textView1"
                     android:gravity="right"
                    android:layout_height="wrap_content" />
            </RelativeLayout>
        </ViewFlipper>

设置延迟时间:

    private static final long DELAYTIME = 1000;

放置视图鳍状肢的clicklistener

            Message msg = new Message();
            msg.what = 1;
            delayHandler.sendMessageDelayed(msg, DELAYTIME);

            vFilpper1.showNext();

最后加上这个:           public Handler delayHandler = new Handler(){

    @Override
    public void handleMessage(Message message) {
        super.handleMessage(message);

        switch (message.what) {
        case 1:
            try {
                vFilpper1.showPrevious();
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;

    so on other viewflipper..

同时访问Documention 如果你认为这不是更好的主意,那么请转到:

how to check previous value in android of viewflipper

http://mobileorchard.com/android-app-development-view-filpper-and-sliding-drawer/