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
- Android-“启动页” 和 "左右导航"
- Android技巧1:启动屏+新功能左右导航
- android系统去除和增加启动导航页
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- Android实现导航菜单左右滑动效果
- win7_oracle11g_64位连接32位PLSQL,ORA-12154: TNS:could not resolve the connect identifier specified解决办法
- Transfer Learning
- 【Hibernate】Hibernate性能优化之延迟加载与抓取策略
- HDU5586(最大子序列变形)
- Mybaits自学总结(一)
- Android-“启动页” 和 "左右导航"
- Unity 5:使用 Asset Bundle 和 Asset Bundle Manager (3)
- conversion-service
- PostgreSQL学习手册(事物隔离)
- Eigen使用vector容器出错
- linux shell 简单用法
- 友元函数和友元类
- 根据包名打开其他应用。
- ORACLE执行定时任务