仿今日头条和qq侧滑和智慧北京的小项目 1
2016-05-24 14:34
555 查看
仿今日头条和QQ侧滑和智慧北京的小项目1
本项目图片素材均来自今日头条,QQ侧滑没有使用Android原生的NavigationDrawer,而使用的是第三方SlidingMenu,原因是这个控件暂时没有仔细研究(后期会研究并写demo),项目整体可以说是使用了一个Activity加多个Fragment,全部采用沉寂式。项目效果预览图
1、SplashActivity(欢迎页)
欢迎页面做了简单的旋转、渐变等动画效果。并设置了全屏主题。
旋转: RotateAnimation
缩放: ScaleAnimation
渐变: AlphaAnimation
集合动画: AnimationSet
全屏主题
AS新建工程默认不是继承Activity了,是继承自AppCompatActivity所以说,以前的什么在Activity中添加requestWindowFeature(Window.FEATURE_NO_TITLE);已经失效了,当然在Activity中配置主题好不好用。进过搜索和自己琢磨,先给出如下解决方案。
在styles.xml中自定义一个主题,parent来自于Theme.AppCompat.Light.NoActionBar。再在Activity中引用自己定义的Theme就OK了
<!--自定义主题--> <style name="NoTitleFullscreen" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowFullscreen">true</item> </style>
GuideActivity(引导页)
引导页使用的是Viewpager,图片素材提取自“今日头条”,并设置了全屏主题
给Viewpager设置图片前,先准备数据
private void initData() { resImageIDS = new int[]{R.drawable.guide_1,R.drawable.guide_2,R.drawable.guide_3}; imageViews = new ArrayList<>(); ImageView imageView; for (int i = 0; i < resImageIDS.length; i++) { imageView = new ImageView(getApplicationContext()); imageView.setBackgroundResource(resImageIDS[i]); imageViews.add(imageView); } }
当页面滑动到最后一个页面时,把Button显示出来,需要个Viewpager设置滑动监听
class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { //页面在滑动的过程中调用 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } //当滑动页面被选中后调用 @Override public void onPageSelected(int position) { //判断vp滑动到最后一个页面后显示button int endPage = imageViews.size() - 1; if (endPage == position) { mStart.setVisibility(View.VISIBLE); }else { mStart.setVisibility(View.GONE); } }
MainActivity(主页面)
主页面使用沉寂式效果,并设置App被虚拟按键遮挡的判断,获取到SlidingMenu(需要继承自SlidingFragmentActivity)
沉寂式处理:MainActivity默认通知栏是透明的,但因为引入了SlidingMenu,侧拉栏没法透明,所以需要让界面伪沉寂式处理,需要加这行代码。让App全屏
//透明状态栏 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ // getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏不带通知栏 // getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//推荐使用 // getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);//备选可用可用(无法设置布局在通知栏下方) }
虚拟按键遮挡全屏处理
//如果是手机有虚拟按键,将自动不被覆盖。 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
SlidingMenu侧拉栏的引入方式
1、让当前Activity继承自SlidingFragmentActivity或SlidingActivity 2、获取到SlidingMenu对象 setContentView(R.layout.activity_main); //获取slidingMean管理器 setBehindContentView(R.layout.left_menu); SlidingMenu slidingMenu = getSlidingMenu(); //设置边界模式 slidingMenu.setMode(SlidingMenu.LEFT); //设置拖拽模式 slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); //设置主屏幕留在界面的宽度 slidingMenu.setBehindOffset(300);
由于右面页面均使用Fragment来实现,所以需要替换Fragment
private void initFragment() { fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.fr_content,new ContentFragment(),CONTENTFRAGMENT); ft.replace(R.id.fy_leftmenu,new LeftMenuFragment(),LEFTMENUFRAGMENT); ft.commit(); }
提供一个找到Fragment对象的方法
public Fragment getFragmentForByTag(String byTag){ return fm.findFragmentByTag(byTag); }
ContentFragment(主界面用Fragment来替换)
初始化了Viewpager和底部的按钮RadioGroup,并给Viewpager设置数据。
给主页面Viewpager设置数据(5个子页面)
@Override public void initData() { //准备Viewpager的数据 basePagerList = new ArrayList<>(); basePagerList.add(new HomePager(mActivity)); basePagerList.add(new NewsCenterPager(mActivity)); basePagerList.add(new SmartServicePager(mActivity)); basePagerList.add(new ZhengWuPager(mActivity)); basePagerList.add(new SettingPager(mActivity)); //初始化Viewpager数据 MyPagerAdapter myPagerAdapter = new MyPagerAdapter(); mViewPagerContent.setAdapter(myPagerAdapter); //解决Viewpager预加载问题 mViewPagerContent.setOnPageChangeListener(new MyOnPageChangeListener()); //设置RadioGroup //radiobutton 选择 mRadioButtonGroup.setOnCheckedChangeListener(new MyOnCheckedChangeListener()); // 设置第一个页面 mRadioButtonGroup.check(R.id.rb_home); }
radiogroup的事件监听
RadioButton点击切换相应页面
设置1和5左侧侧拉栏不可用(需要从MainActivity中获取SlidingMenu对象)
/** * 设置左侧侧拉栏不可用 * @param value */ private void slidingEnable(boolean value) { MainActivity mActivity = (MainActivity) this.mActivity; SlidingMenu slidingMenu = mActivity.getSlidingMenu(); if (value) { slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); }else { slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); } }
RadioButton加载图片(适配问题)
加载图片
如果把图片放到XXX目录下,显示的就会越小,但越清晰,如果放到X目录下,或者mdpi下,图片就会放大。但不清晰。
LeftMenuFragment(左侧侧拉栏用Fragment来替换)
暂不实现逻辑,后续处理,参考这里:仿今日头条和qq侧滑和智慧北京的小项目 2BaseFragment(抽取共性的Fragment)
主界面、左侧侧栏了都使用Fragment来替换,所以抽取出一个父类的Fragment。定义了初始化View和初始化Data的方法,抽取出一个Fragment全局的上下文对象。
/** * Created by Hsia on 16/5/21. * E-mail: xiaweifeng@live.cn * TODO:所有Fragment的基类 * 上下文抽取 * 初始化布局的方法抽取: 抽象 * 初始化数据的方法抽取: 可选 */ public abstract class BaseFragment extends Fragment{ public Activity mActivity;//所有Fragment的上下文对象 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivity = getActivity(); } //初始化View @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = initView(); return view; } /** * Activity已经初始化完毕了, 当前需要初始化Fragment的数据了 * @param savedInstanceState */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initData(); } //所有继承BaseFragment的的类都需要初始化自己的View public abstract View initView(); /** * 初始化数据, 子类覆盖此方法, 来实现自己的数据初始化操作 */ public void initData(){ } }
未完待续……
仿今日头条和qq侧滑和智慧北京的小项目 2
关于作者
- 个人主页:Hsia
- Email:xiaweifeng@live.cn
- 项目地址:https://github.com/swordman20/Zhbj
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories