`
he91_com
  • 浏览: 397251 次
文章分类
社区版块
存档分类
最新评论

ViewFlipper动态加载View

 
阅读更多

知识点:

1.ViewFlipper基本用法及动态添加View;

2.ViewFlipper结合手势翻页+特效;

3.WindowManager的基本用法。

任意张图片实现循环滑动,其实PageFlipper当前最多的子View个数(ChildViewCount)小于等于2.


源码路径:http://download.csdn.net/detail/zhouyuanjing/4764619


fliper_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center" />

</LinearLayout>

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ViewFlipper
        android:id="@+id/myViewFlipper"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
        
    </ViewFlipper>

</LinearLayout>

MainActivity.java:

package com.xyz.pagefilter;

import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class MainActivity extends Activity implements OnTouchListener,
        OnGestureListener {

    private LayoutInflater mInflater;
    private WindowManager wm = null;
    private WindowManager.LayoutParams wmParams = null;

    private ImageView leftbtn = null;
    private ImageView rightbtn = null;

    private int mAlpha = 0;
    private boolean isHide;

    private int mCurrPos = 0;

    private ViewFlipper viewFlipper = null;
    private GestureDetector mGestureDetector;

    private int[] mImages = new int[] { R.drawable.img_0, R.drawable.img_1,
            R.drawable.img_2, R.drawable.img_3, R.drawable.img_4,
            R.drawable.img_5, R.drawable.img_6, R.drawable.img_7,
            R.drawable.img_8, R.drawable.img_9 };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);

        mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        viewFlipper = (ViewFlipper) this.findViewById(R.id.myViewFlipper);
        setView(mCurrPos, 0);
       initFloatView();

        // viewFlipper.setLongClickable(true);
        viewFlipper.setOnTouchListener(this);
        mGestureDetector = new GestureDetector(this);

    }

    private void initFloatView() {
        wm = (WindowManager) getApplicationContext().getSystemService(
                Context.WINDOW_SERVICE);
        wmParams = new WindowManager.LayoutParams();

        wmParams.type = LayoutParams.TYPE_PHONE; 
        wmParams.format = PixelFormat.RGBA_8888; 
        
        wmParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
                | LayoutParams.FLAG_NOT_FOCUSABLE;

        wmParams.x = 0;
        wmParams.y = 0;

        wmParams.width = 50;
        wmParams.height = 50;

        createLeftFloatView();
        createRightFloatView();
    }

    private void createLeftFloatView() {
        leftbtn = new ImageView(this);
        leftbtn.setImageResource(R.drawable.prev);
        leftbtn.setAlpha(0);
        leftbtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                movePrevious();
            }
        });
        
        wmParams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
        
        wm.addView(leftbtn, wmParams);
    }

    private void createRightFloatView() {
        rightbtn = new ImageView(this);
        rightbtn.setImageResource(R.drawable.next);
        rightbtn.setAlpha(0);
        rightbtn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                moveNext();
            }
        });
        
        wmParams.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL;
        
        wm.addView(rightbtn, wmParams);
    }

    private void setView(int curr, int next) {
        View v = (View) mInflater.inflate(R.layout.flipper_item, null);
        ImageView iv = (ImageView) v.findViewById(R.id.img);
        // iv.setScaleType(ImageView.ScaleType.FIT_XY);
        if (curr < next && next > mImages.length - 1)
            next = 0;
        else if (curr > next && next < 0)
            next = mImages.length - 1;
        iv.setImageResource(mImages[next]);
        if (viewFlipper.getChildCount() > 1) {
            viewFlipper.removeViewAt(0);
        }
        viewFlipper.addView(v, viewFlipper.getChildCount());
        mCurrPos = next;

    }

    private void movePrevious() {
        setView(mCurrPos, mCurrPos - 1);
        viewFlipper.setInAnimation(MainActivity.this, R.anim.in_leftright);
        viewFlipper.setOutAnimation(MainActivity.this, R.anim.out_leftright);
        viewFlipper.showPrevious();
    }

    private void moveNext() {
        setView(mCurrPos, mCurrPos + 1);
        viewFlipper.setInAnimation(MainActivity.this, R.anim.in_rightleft);
        viewFlipper.setOutAnimation(MainActivity.this, R.anim.out_rightleft);
        viewFlipper.showNext();
    }

    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 1 && mAlpha < 255) {
                mAlpha += 50;
                if (mAlpha > 255)
                    mAlpha = 255;
                leftbtn.setAlpha(mAlpha);
                leftbtn.invalidate();
                rightbtn.setAlpha(mAlpha);
                rightbtn.invalidate();
                if (!isHide && mAlpha < 255)
                    mHandler.sendEmptyMessageDelayed(1, 100);
            } else if (msg.what == 0 && mAlpha > 0) {
                mAlpha -= 10;
                if (mAlpha < 0)
                    mAlpha = 0;
                leftbtn.setAlpha(mAlpha);
                leftbtn.invalidate();
                rightbtn.setAlpha(mAlpha);
                rightbtn.invalidate();
                if (isHide && mAlpha > 0)
                    mHandler.sendEmptyMessageDelayed(0, 100);
            }
        }
    };

    private void showFloatView() {
        isHide = false;
        mHandler.sendEmptyMessage(1);
    }

    private void hideFloatView() {
        new Thread() {
            public void run() {
                try {
                    Thread.sleep(1500);
                    isHide = true;
                    mHandler.sendEmptyMessage(0);
                } catch (Exception e) {
                }
            }
        }.start();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        wm.removeView(leftbtn);
        wm.removeView(rightbtn);
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        int x = (int) (e2.getX() - e1.getX());
        if (x > 0) {
            movePrevious();
        } else {
            moveNext();
        }
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {

    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        // 用户轻触屏幕,尚末松开或拖动,注意,强调的是没有没有松开或者拖动状态
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_DOWN:
            showFloatView();
            break;
        case MotionEvent.ACTION_UP:
            hideFloatView();
            break;
        }
        mGestureDetector.onTouchEvent(event);
        return true;
    }
}

附加特效文件:

in_leftright.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromXDelta="-100%p"
        android:toXDelta="0" />

    <alpha
        android:duration="500"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />

</set>
in_rightleft.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="500"
        android:fromXDelta="100%p"
        android:toXDelta="0" />
    
    <alpha
        android:duration="500"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
</set>
out_leftright.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <translate
        android:duration="500"
        android:fromXDelta="0"
        android:toXDelta="100%p" />
    
    <alpha
        android:duration="500"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>
out_rightleft.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromXDelta="0"
        android:toXDelta="-100%p" />

    <alpha
        android:duration="500"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />

</set>

源码路径:http://download.csdn.net/detail/zhouyuanjing/4764619

分享到:
评论

相关推荐

    Android通过view复用优化ViewFlipper用法

    2. **动态加载**:只有当视图即将显示时才进行加载,不在初始化时一次性加载所有视图。这可以通过监听ViewFlipper的切换事件来实现。 3. **重用现有视图**:如果多个视图有相似的结构,可以尝试共享一个基础视图...

    ViewFlipper通过两个View实现无限播放

    本篇将深入探讨如何利用ViewFlipper通过两个View实现无限播放的效果,这对于创建动态、吸引用户的UI至关重要。 首先,了解ViewFlipper的基本用法。ViewFlipper继承自ViewGroup,可以包含多个子视图(Views)。默认...

    viewFlipper

    `ViewFlipper`是Android平台中的一个视图切换器组件,常用于实现各种动态效果,如广告栏的轮询播放、页面的滑动切换等。它继承自`ViewGroup`,能够管理多个子视图,并在指定的时间间隔内自动或手动进行切换。本篇...

    viewflipper

    在MVVM架构中,`ViewFlipper`可以与适配器结合使用,动态加载和切换数据驱动的视图,比如图片轮播。 总之,`ViewFlipper`是Android开发者在实现视图切换和轮播效果时的一个强大工具。通过合理运用其内置的功能和...

    ViewFlipper

    ViewFlipper是Android开发中的一个视图切换组件,它主要用于实现各种动态效果,如轮播图、卡片翻转等。这个组件是ViewGroup的子类,能够轻松地在多个子视图之间进行切换,同时提供动画效果,使得应用界面更加生动...

    循环viewFlipper实现

    通常,这些子视图可以是ImageView、TextView或其他任何视图,这使得ViewFlipper成为一个展示动态内容的理想选择,比如轮播广告或图片库。 要实现循环播放图片,首先你需要在XML布局文件中添加一个ViewFlipper元素,...

    ViewFlipper的使用,仿淘宝头条垂直滚动广告条

    如果广告内容需要动态加载,可以通过网络请求获取数据,然后在运行时动态添加到ViewFlipper中。这通常涉及AsyncTask或者Retrofit等网络库的使用,将下载到的图片设置到ImageView,再添加到ViewFlipper。 总结起来...

    ViewFlipper的三个小例子

    NotifiableViewFlipper的实现通常需要继承ViewFlipper并重写`onFinishInflate()`方法,以便在所有子视图加载完成后执行初始化操作。同时,你需要提供一个通知接口,让外部类可以订阅切换事件: ```java public ...

    《ViewFlipper使用详解》对应源码

    你可以创建一个`ArrayAdapter`或`BaseAdapter`,并在`getView()`方法中返回不同的视图,然后在`ViewFlipper`中动态加载这些视图。 通过查看`ViewFlipper使用详解`中的源码,你可以更深入地理解以上概念,并学习如何...

    ViewFlipper无限轮播

    ViewFlipper viewFlipper = findViewById(R.id.view_flipper); List&lt;View&gt; views = new ArrayList(); // 填充你的视图 views.add(view1); views.add(view2); // 添加额外的首尾视图 views.add(0, view1.copy()); // ...

    ViewFlipper图片滑屏双击放大 图片旋转

    在Android开发中,ViewFlipper是一个非常有用的布局控件,它允许我们轻松地在多个视图之间进行切换,常用于创建动态的用户界面,如轮播图、相册等。本教程将详细介绍如何利用ViewFlipper实现图片的左右滑动、双击...

    viewflipper自动播放状态更新

    ViewFlipper viewFlipper = findViewById(R.id.view_flipper); // 设置翻页间隔,单位为毫秒 viewFlipper.setFlipInterval(3000); // 每3秒翻页 // 开启自动翻页 viewFlipper.startFlipping(); // 创建定时器和...

    ViewFlipper实现图片轮播

    ViewFlipper viewFlipper = findViewById(R.id.view_flipper); viewFlipper.setInAnimation(this, R.anim.slide_in_left); viewFlipper.setOutAnimation(this, R.anim.slide_out_right); final Handler handler = ...

    ViewFlipper的使用

    - **数据加载**:在数据加载过程中,可以使用`ViewFlipper`展示不同的加载状态,如加载中、错误提示或空数据视图。 总之,`ViewFlipper`是Android中实现视图切换和动态展示的强大工具,通过灵活运用它的各种功能,...

    ViewFlipper简单使用

    ViewFlipper是Android SDK中的一个视图容器,它允许开发者在一个布局中动态地显示和隐藏多个视图。在本教程中,我们将深入探讨如何利用ViewFlipper实现图片轮播和图片之间的滑动切换效果。 首先,理解ViewFlipper的...

    ViewFlipperDemo.zip

    在这个"ViewFlipperDemo.zip"中,我们很可能会看到一个演示如何使用ViewFlipper来创建动态视图切换的应用示例。 首先,我们要理解ViewFlipper的基本用法。ViewFlipper继承自ViewGroup,这意味着它可以包含一个或多...

Global site tag (gtag.js) - Google Analytics