【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2140|回复: 0

Android 实现界面的滑动导航条指引效果

[复制链接]
发表于 2013-5-2 11:59:32 | 显示全部楼层 |阅读模式

我们还是先来看一下效果图,让大家清楚我们将要说的是一个怎么效果,

笔者这用的图片很烂,是随便截了一个项目的界面做成的,
大家从上面可以看出这是一个界面滑动效果,而且下面有导航条指引的,导航条和上面的界面是可以循环的,我们经常可以在一些软件中看到这种效果,如腾讯微信在安装后就有这一个效果,用此向用户图文介绍软件的功能,其实这一功能很简单,
简单介绍一下要点:
上面的界面是一个ViewFlipper控件,通过对ViewFlipper加入数个界面,
下面的那导航条是一个LinearLayout控件,在它中加入一个imageview数组,通过数组的下标来控件当前选中的图片,

下面androidkaifa.com就为大家提供这个效果的代码,希望对大家有帮助:
public class ExtendsFrameLayoutView extends FrameLayout {
    private int mCurrentIndex=0;
    private Context context;
    //点击屏幕的X左边值.
    private float startX;
    //设备的宽度.
    private int mDisplayWidth;
    /**
     * 从左到右进入的动画.
     */
    private Animation mLeft2RightInAnimation;      
    /**
     * 从左到右出去动画.
     */
    private Animation mLeft2RightOutAnimation;      
    /**
     * 从右到左进入动画.
     */
    private Animation mRight2LeftInAnimation;   
    /**
     * 从右到左出去动画.
     */
    private Animation mRight2LeftOutAnimation;
    private long duration=1000;
    private ViewFlipper mViewFlipper;
    //生成下面的那个点点的容器
    private LinearLayout mTipLinearLayout;
    //正常显示的点点
    private Bitmap mPointNorBitmap;
    //被选中的点点
    private Bitmap mPointSelectBitmap;
   
    private int[] imgResIds = {R.drawable.test1,R.drawable.test2,R.drawable.test3,
            R.drawable.test4,R.drawable.test5};
   
    public ExtendsFrameLayoutView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        initView();
    }

    public ExtendsFrameLayoutView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    public ExtendsFrameLayoutView(Context context) {
        super(context);
        initView();
    }
    //初始化控件
    public void initView(){
        context=getContext();
        mDisplayWidth=getResources().getDisplayMetrics().widthPixels;
        mViewFlipper=new ViewFlipper(context);
        mTipLinearLayout=new LinearLayout(context);
        mPointNorBitmap=BitmapFactory.decodeResource(context.getResources(), R.drawable.btn_normal);
        mPointSelectBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.btn_focus);
        ////将图片界面加入mViewFlipper布局中
        for(int i=0;i<imgResIds.length;i++){
            ImageView imageView=new ImageView(context);
            imageView.setImageResource(imgResIds);
            mViewFlipper.addView(imageView);
        }
        //将下面的那些点点动态加入到LinearLayout布局中
        for(int j=0;j<imgResIds.length;j++){
            ImageView imageView=new ImageView(context);
            if(j==0){
                imageView.setImageBitmap(mPointSelectBitmap);
            }else{
                imageView.setImageBitmap(mPointNorBitmap);
            }
            mTipLinearLayout.addView(imageView);
        }
        addView(mViewFlipper);
        addView(mTipLinearLayout);
        //设置下面的那些点点按底部和水平居中
        mTipLinearLayout.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL);
        //初始化动画
        mLeft2RightInAnimation = new TranslateAnimation(-mDisplayWidth, 0, 0, 0);
        mLeft2RightInAnimation.setDuration(duration);
        mLeft2RightOutAnimation = new TranslateAnimation(0, mDisplayWidth, 0, 0);
        mLeft2RightOutAnimation.setDuration(duration);
         
        mRight2LeftInAnimation = new TranslateAnimation(mDisplayWidth, 0, 0, 0);
        mRight2LeftInAnimation.setDuration(duration);
        mRight2LeftOutAnimation = new TranslateAnimation(0, -mDisplayWidth, 0, 0);
        mRight2LeftOutAnimation.setDuration(duration);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch(event.getAction()){
        case MotionEvent.ACTION_DOWN:
            startX=event.getX();
            break;
        case MotionEvent.ACTION_UP:
            ImageView lastImageView=(ImageView)mTipLinearLayout.getChildAt(mCurrentIndex);
            //通过对触摸屏幕时的X坐标的改变来判断导航的方向
            if(event.getX()>startX){//后退
                mViewFlipper.setInAnimation(mLeft2RightInAnimation);
                mViewFlipper.setOutAnimation(mLeft2RightOutAnimation);
                mViewFlipper.showPrevious();
                mCurrentIndex--;
                if(mCurrentIndex<0){
                    mCurrentIndex=imgResIds.length-1;
                }
            }else if(event.getX()<startX){//前进
                mViewFlipper.setInAnimation(mRight2LeftInAnimation);
                mViewFlipper.setOutAnimation(mRight2LeftOutAnimation);
                mViewFlipper.showNext();
                mCurrentIndex++;
                if(mCurrentIndex>imgResIds.length-1){
                    mCurrentIndex=0;
                }
            }
            ImageView imageView=(ImageView)mTipLinearLayout.getChildAt(mCurrentIndex);
            imageView.setImageBitmap(mPointSelectBitmap);
            lastImageView.setImageBitmap(mPointNorBitmap);
            break;
        default :
                break;
        }
        return true;
    }
}
主activity类代码:
protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(new ExtendsFrameLayoutView(this));
    }
看完上面的代码,不知大家会不会有同感,这功能其实很简单,
可能有一些朋友需要让这个效果是自动滚动的,如这样,可自己另加一个线程,每隔多少时间让它执行一次IF下面的语句(需将IF里的代码单独放在一个方法中),整个项目代码,笔者就没有放上来了,需要的朋友,请留言,我发给你!


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-6-17 00:38

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表