Android-“启动页” 和 "左右导航"

来源:互联网 发布:openwrt wifi mac 编辑:程序博客网 时间:2024/06/10 13:07

前言

本文介绍一下APP常用的启动页和左右导航页面的使用。
需求: 先判断是否第一次启动app,如果是,则进入功能使用导航(最简单的做法就是,左右滑动切换查看,滑动到最后一页点击按钮进入首页)。
如果不是,则显示启动屏,2秒之后进入首页。

先来看看效果图:
这里写图片描述

1,首先来看看启动页是如何实现的:

public class MainActivity extends AppCompatActivity {    private Context mcontext;    private Bitmap m_background;    private Intent intent = null ;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    mcontext = this;    init();}    private void init() {        ImageView iv_welcome = (ImageView) findViewById(R.id.image_welcome);        DisplayMetrics metrics = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(metrics);        AlphaAnimation anim = new AlphaAnimation(1.0f, 1.0f);        anim.setDuration(3000);        anim.setAnimationListener(mAnimationListener);        iv_welcome.setAnimation(anim);        anim.start();    }private Animation.AnimationListener mAnimationListener = new Animation.AnimationListener() {    @Override    public void onAnimationStart(Animation animation) {        // TODO Auto-generated method stub    }    @Override    public void onAnimationRepeat(Animation animation) {        // TODO Auto-generated method stub    }    @Override    public void onAnimationEnd(Animation animation) {        openMainUi();    }};    public void openMainUi() {        intent = new Intent();        intent.setClass(this, WelcomePageActivity.class);        startActivity(intent);        finish();    }}

2,启动页的布局文件:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#0bc301" >    <ImageView        android:id="@+id/image_welcome"        android:layout_width="fill_parent"        android:layout_height="218dp"        android:layout_centerHorizontal="true"        android:layout_marginTop="100dp"        android:src="@drawable/logo" /></RelativeLayout>

说明: 启动页布局文件设置一个背景色, 然后在增加一张icon , 在启动页中增加一个延迟3秒钟,然后跳转到WelcomePageActivity.class 。

3,左右导航页面的实现:

public class WelcomePageActivity extends FragmentActivity {    private MyViewPager mPager;    private FragmentPagerAdapter mAdapter = null;    private FragmentTransaction transaction;    private String[] CONTENT = new String[] { "A", "B", "C" };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_welcome_page);        initView();    }    private void initView() {        // TODO Auto-generated method stub        mAdapter = new ZimilanProductAdapter(getSupportFragmentManager());        mPager = (MyViewPager) findViewById(R.id.tab_pager);        mPager.setAdapter(mAdapter);    }    class ZimilanProductAdapter extends FragmentPagerAdapter {        public ZimilanProductAdapter(FragmentManager fm) {            super(fm);        }        @Override        public Fragment getItem(int position) {            switch (position) {            case 0:                return WelcomePageAFragment.newInstance(); // A            case 1:                return WelcomePageBFragment.newInstance(); // B            case 2:                return WelcomePageCFragment.newInstance(); // C            default:                break;            }            return null;        }        @Override        public CharSequence getPageTitle(int position) {            return CONTENT[position % CONTENT.length].toUpperCase();        }        @Override        public int getCount() {            return CONTENT.length;        }    }}

4,自定一个MyViewPager :

public class MyViewPager extends ViewPager {    private ViewPager mPager;    private int abc = 1;    // private int mCurPage = 0;    private float mLastMotionX;    String TAG = "@";    private GuidePageChangeListener m_guide_pagechange_listener = new GuidePageChangeListener();    private float firstDownX;    private float firstDownY;    private boolean flag = false;    private float mLastMotionY;    private float xDistance, yDistance;    private GestureDetector mGestureDetector;    private Handler adClickHandler;    public ViewPager getmPager() {        return mPager;    }    public void setmPager(ViewPager mPager) {        this.mPager = mPager;    }    public MyViewPager(Context context, AttributeSet attrs) {        super(context, attrs);        this.setOnPageChangeListener(m_guide_pagechange_listener);    }    public MyViewPager(Context context) {        super(context);        this.setOnPageChangeListener(m_guide_pagechange_listener);    }    // public int getCurPage() {    // return mCurPage;    // }    // 是否启动图片轮播功能    public void setIsOpen(boolean open) {        if (open == true) {            handler.postDelayed(timerTask, 4500);            try {                Field field = ViewPager.class.getDeclaredField("mScroller");                field.setAccessible(true);                FixedSpeedScroller scroller = new FixedSpeedScroller(this.getContext(),                        new AccelerateInterpolator());                field.set(this, scroller);                scroller.setmDuration(700);            } catch (Exception e) {               // LogUtils.e(TAG, "", e);            }        }    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        final float x = ev.getX();        final float y = ev.getY();        switch (ev.getAction()) {        case MotionEvent.ACTION_DOWN:            xDistance = 0;            yDistance = 0;            // down事件注册不拦截            getParent().requestDisallowInterceptTouchEvent(true);            abc = 1;            // down下来的x y坐标            mLastMotionX = x;            mLastMotionY = y;            break;        case MotionEvent.ACTION_MOVE:            if (abc == 1) {                // 获得滑动的距离 x y                xDistance += Math.abs(x - mLastMotionX);                yDistance += Math.abs(y - mLastMotionY);                // 如果X滑动比较长 认为这个事件是左右滑动                if (xDistance > yDistance + 5) {                    // 向右滑动 并且当前处于第一页 允许出现menu也就是取消注册不允许拦截                    if (x - mLastMotionX > 2 && getCurrentItem() == 0) {                        abc = 0;                        getParent().requestDisallowInterceptTouchEvent(false);                    }                    // 向左滑动                    if (x - mLastMotionX < -2                            && getCurrentItem() == getAdapter().getCount() - 1) {                        abc = 0;                        getParent().requestDisallowInterceptTouchEvent(false);                    }                } else if (yDistance > xDistance + 5) {                    // 如果Y滑动比较长 直接取消注册                    getParent().requestDisallowInterceptTouchEvent(false);                }                // if (y - mLastMotionY > 2) {                // abc = 0;                // getParent().requestDisallowInterceptTouchEvent(false);                // }            }            break;        case MotionEvent.ACTION_UP:        case MotionEvent.ACTION_CANCEL:            // getParent().requestDisallowInterceptTouchEvent(false);            break;        }        return super.dispatchTouchEvent(ev);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent arg0) {        // TODO Auto-generated method stub        return super.onInterceptTouchEvent(arg0);    }    public void setGestureDetector(GestureDetector gesturedetector) {        mGestureDetector = gesturedetector;        setOnTouchListener(new OnTouchListener() {            public boolean onTouch(View v, MotionEvent event) {                mGestureDetector.onTouchEvent(event);                return false;            }        });    }    /** 指引页面改监听器 */    class GuidePageChangeListener implements OnPageChangeListener {        @Override        public void onPageScrollStateChanged(int arg0) {            // Log.i("voice", arg0+ "-------------onPageScrollStateChanged");        }        @Override        public void onPageScrolled(int arg0, float arg1, int arg2) {        }        @Override        public void onPageSelected(int arg0) {            // mCurPage = arg0;        }    }    // 图片轮播具体方法    public void setHandler(Handler handler) {        this.adClickHandler = handler;    }    Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            if (getAdapter() == null || getAdapter().getCount() == 0) {                return;            }            int curItem = getCurrentItem() + 1;            if (curItem >= getAdapter().getCount()) {                curItem = 0;            }            setCurrentItem(curItem, true);        }    };    TimerTask timerTask = new TimerTask() {        @Override        public void run() {            // TODO Auto-generated method stub            handler.sendEmptyMessage(1);            handler.postDelayed(this, 4500);        }    };    public class FixedSpeedScroller extends Scroller {        private int mDuration = 1500;        public FixedSpeedScroller(Context context) {            super(context);        }        public FixedSpeedScroller(Context context, Interpolator interpolator) {            super(context, interpolator);        }        @Override        public void startScroll(int startX, int startY, int dx, int dy, int duration) {            // Ignore received duration, use fixed one instead            super.startScroll(startX, startY, dx, dy, mDuration);        }        @Override        public void startScroll(int startX, int startY, int dx, int dy) {            // Ignore received duration, use fixed one instead            super.startScroll(startX, startY, dx, dy, mDuration);        }        public void setmDuration(int time) {            mDuration = time;        }        public int getmDuration() {            return mDuration;        }    }}

说明:具体页面实现就在WelcomePageActivity 的 WelcomePageAFragment ,WelcomePageBFragment,WelcomePageCFragment 这三个字Fragment的左右滑动,其中MyViewPager就是负责控制这个页面内容的滑动效果。

5,最后实现跳转到首页。

public class WelcomePageCFragment extends Fragment {    public static Fragment newInstance() {        WelcomePageCFragment f = new WelcomePageCFragment();        return f;    }    public WelcomePageCFragment() {    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {        // TODO Auto-generated method stub        View view = inflater.inflate(R.layout.layout_welcome_page_c,                container, false);        ImageView img_wel_start = (ImageView) view                .findViewById(R.id.img_wel_start);        img_wel_start.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View arg0) {                // TODO Auto-generated method stub                Intent intent = new Intent();                intent.setClass(getActivity(), MainFragmentActivity.class);                startActivity(intent);                getActivity().finish();            }        });        return view;    }}

代码下载

0 0