`

自定义FrameLayout 实现屏幕一张张翻

阅读更多
http://wang-peng1.iteye.com/blog/995814
class PanelSwitcher extends FrameLayout {
    private static final int MAJOR_MOVE = 60;
    private static final int ANIM_DURATION = 400;
    private GestureDetector mGestureDetector;
    private int mCurrentView;
    private View mChild, mHistoryView;
    private View children[];
    private int mWidth;
    private TranslateAnimation inLeft;
    private TranslateAnimation outLeft;
    private TranslateAnimation inRight;
    private TranslateAnimation outRight;
    private static final int NONE  = 1;
    private static final int LEFT  = 2;
    private static final int RIGHT = 3;
    private int mPreviousMove;
    public PanelSwitcher(Context context, AttributeSet attrs) {
        super(context, attrs);
        mCurrentView = 0;
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                                       float velocityY) {
                    int dx = (int) (e2.getX() - e1.getX());
                    // don't accept the fling if it's too short
                    // as it may conflict with a button push
                    if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.abs(velocityY)) {
                        if (velocityX > 0) {
                            moveRight();
                        } else {
                            moveLeft();
                        }
                        return true;
                    } else {
                        return false;
                    }
                }
            });
    }
    @Override 
    public void onSizeChanged(int w, int h, int oldW, int oldH) {
        mWidth = w;
        inLeft   = new TranslateAnimation(mWidth, 0, 0, 0);
        outLeft  = new TranslateAnimation(0, -mWidth, 0, 0);        
        inRight  = new TranslateAnimation(-mWidth, 0, 0, 0);
        outRight = new TranslateAnimation(0, mWidth, 0, 0);
        inLeft.setDuration(ANIM_DURATION);
        outLeft.setDuration(ANIM_DURATION);
        inRight.setDuration(ANIM_DURATION);
        outRight.setDuration(ANIM_DURATION);
    }
    protected void onFinishInflate() {
        int count = getChildCount();
        children = new View[count];
        for (int i = 0; i < count; ++i) {
            children[i] = getChildAt(i);
            if (i != mCurrentView) {
                children[i].setVisibility(View.GONE);
            }
        }
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mGestureDetector.onTouchEvent(event);
        return true;
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return mGestureDetector.onTouchEvent(event);
    }
    void moveLeft() {
        //  <--
        if (mCurrentView < children.length - 1 && mPreviousMove != LEFT) {
            children[mCurrentView+1].setVisibility(View.VISIBLE);
            children[mCurrentView+1].startAnimation(inLeft);
            children[mCurrentView].startAnimation(outLeft);
            children[mCurrentView].setVisibility(View.GONE);
            mCurrentView++;
            mPreviousMove = LEFT;
        }
    }
    void moveRight() {
        //  -->
        if (mCurrentView > 0 && mPreviousMove != RIGHT) {
            children[mCurrentView-1].setVisibility(View.VISIBLE);
            children[mCurrentView-1].startAnimation(inRight);
            children[mCurrentView].startAnimation(outRight);
            children[mCurrentView].setVisibility(View.GONE);
            mCurrentView--;
            mPreviousMove = RIGHT;
        }
    }
    int getCurrentIndex() {
        return mCurrentView;
    }
}

分享到:
评论

相关推荐

    Android应用开发-FrameLayout的使用.pptx

    FrameLayout常用于需要在屏幕特定位置显示单一视图的情况,例如浮动按钮、对话框的背景或者需要始终显示在顶部的提示信息。尽管它的功能有限,但与其他布局配合使用时,可以实现复杂的界面设计。 总结来说,...

    android的一个图片游览效果

    1. **自定义View**:`SlidingCard`可能是一个自定义的ViewGroup,比如继承自LinearLayout或FrameLayout,这样可以容纳每张图片并添加滑动动画。自定义View需要重写`onDraw()`方法来绘制内容,可能还需要用到`...

    Android编程自定义组件实例详解

    在Android应用开发中,自定义组件是提升用户体验和实现独特设计的重要手段。本文将深入讲解如何在Android中创建自定义组件,以及一个具体的实例——自定义绘图的图片视图。 1. **自定义组件的基本原理** 自定义...

    Android左右上下图片滑动.zip

    在"SwipeCard"项目中,最核心的组件可能是自定义的`ViewGroup`,这个自定义视图会承载每一张卡片(图片或者其他内容)。每个卡片通常是一个`LinearLayout`或`FrameLayout`,包含需要展示的图片和其他元素。为了实现...

    Android点击屏幕,在点击位置绘制桃心

    在这个例子中,我们需要监听整个屏幕的点击事件,因此通常会将监听器设置在`Activity`的根布局上,如`FrameLayout`或`RelativeLayout`。代码示例如下: ```java findViewById(android.R.id.content)....

    单虚拟摇杆图片版

    1. **资源准备**:首先,你需要准备两张图片,一张作为摇杆的中心,另一张作为摇杆本身。确保图片大小适中,并且有良好的视觉效果。 2. **布局设计**:在Android的XML布局文件中,创建一个`FrameLayout`或者`...

    android 广告轮播banner

    1. **创建自定义View**:继承`FrameLayout`或`LinearLayout`,并在此基础上添加对子视图的操作,包括添加ImageViews、设置布局参数等。 2. **数据绑定**:使用`ArrayList`存储广告数据,每个元素可以是包含图片URL和...

    android 图片浏览器

    不过需要注意的是,从Android 5.0 (API级别21)开始,`Gallery`已被弃用,开发者通常会转向使用`RecyclerView`或者自定义布局来实现类似的功能。 4. **图片加载优化**: 当处理大量图片时,性能优化是必须考虑的问题...

    Android实现带描边的圆角图片

    我们可以使用FrameLayout类来管理自定义的绘图类,并将其添加到活动中。 7. layouts文件:layouts文件是Android中的一个布局文件,用于定义活动的布局。我们可以在layouts文件中定义自定义的绘图类,并将其添加到...

    Android中使用imageviewswitcher 实现图片切换轮播导航的方法

    同样,从第一张切换到下一张时也要回到最后一张。 通过以上步骤,我们可以实现一个基本的图片轮播导航功能。在实际项目中,可能还需要考虑更多细节,如图片的缓存策略、加载进度提示、点击事件处理等。不过,这些...

    android 实现在照片上绘制涂鸦的方法

    接下来是绘制涂鸦的核心部分,这通常通过自定义`View`类实现。在这个自定义`View`中,重写`onTouchEvent`方法以响应用户的触摸事件。当用户手指按下屏幕(ACTION_DOWN)时,记录下初始坐标;在手指移动过程中...

    Android开发仿扫一扫实现拍摄框内的照片功能

    为了实现扫描框的效果,我们可以使用`FrameLayout`作为容器,将`SurfaceView`放在最底层,然后在上方添加一个带有半透明背景的`ImageView`或自定义视图,中间挖空对应扫描框的形状。这样可以简单地实现扫描框的视觉...

Global site tag (gtag.js) - Google Analytics