博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
带你实现开发者头条(一) 启动页实现
阅读量:7064 次
发布时间:2019-06-28

本文共 5556 字,大约阅读时间需要 18 分钟。

title: 带你实现开发者头条(一) 启动页实现

tags: 开发者头条app,启动页
grammar_cjkRuby: true
---

对于很多初学者或者刚工作的Android新手来说,我们的项目经验还停留在做demo的阶段,有没有一种很low的感觉,并且当你真正上手做大项目的时候又不知道把自己学到的东西用上去。。有一种自己家里有座金山却不知道可以用来换钱换吃的。这里写图片描述

经过345大神的提醒,说觉得开发者头条这个app不错,用到了很多android中常用的技术,叫我写一系列的文章,去模仿一个商业的app。于是我去下载了一个开发者头条app(之前从未用过,是不是很out)。用了之后总结他的技术,打算以仿开发者头条项目为主线写一系列的Android开发教程 中间会穿插各种常用到的知识点模块 最终完成这样一个项目.

废话就说这么多了,开始今天的正题,带你实现开发者头条APP的启动页。

一.老规矩,先上效果图

这里写图片描述

从效果图中我们可以看出,整个滑动的界面就是一个ViewPager实现,然后监听ViewPager的滑动事件,改变底部四个小图标的切换,以及跳转到首页的按钮的隐藏显示。

二.代码实现

1).整个布局文件。上面是ViewPager,下面是四个小图标存放的容器。

2).LauncherActivity 首先判断是否第一次启动,如果不是第一次直接进入首页,是第一次启动就初始化ViewPager,设置适配器,设置ViewPager滑动监听,然后添加底部的。。。View。 在Viewpager监听函数里面改变底部图标的选中状态,如果是最后一页显示“开启我的头条”按钮。

/** * 第一次启动页面 *  * @author Ansen * @create time 2016-04-15 */@SuppressLint("ResourceAsColor")public class LauncherActivity extends FragmentActivity implements ILauncherView {    private ViewPager viewpagerLauncher;    private LauncherPagerAdapter adapter;    private ImageView[] tips;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_luancher);                if(!isFirst()){            gotoMain();        }        viewpagerLauncher = (ViewPager) findViewById(R.id.viewpager_launcher);        adapter = new LauncherPagerAdapter(this, this);        viewpagerLauncher.setOffscreenPageLimit(2);        viewpagerLauncher.setCurrentItem(0);        viewpagerLauncher.setOnPageChangeListener(changeListener);        viewpagerLauncher.setAdapter(adapter);        viewpagerLauncher.setOnPageChangeListener(changeListener);        ViewGroup group = (ViewGroup) findViewById(R.id.viewGroup);// 初始化底部显示控件        tips = new ImageView[4];        for (int i = 0; i < tips.length; i++) {            ImageView imageView = new ImageView(this);            if (i == 0) {                imageView.setBackgroundResource(R.drawable.page_indicator_focused);            } else {                imageView.setBackgroundResource(R.drawable.page_indicator_unfocused);            }            tips[i] = imageView;            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));            layoutParams.leftMargin = 10;// 设置点点点view的左边距            layoutParams.rightMargin = 10;// 设置点点点view的右边距            group.addView(imageView, layoutParams);        }    }    private OnPageChangeListener changeListener = new OnPageChangeListener() {        @Override        public void onPageScrollStateChanged(int arg0) {}        @Override        public void onPageScrolled(int arg0, float arg1, int arg2) {}        @Override        public void onPageSelected(int index) {            setImageBackground(index);// 改变点点点的切换效果            TextView tvStartHeadlines = (TextView) adapter.getViews().get(index).findViewById(R.id.tv_start_headlines);            if (index == tips.length - 1) {
// 最后一个 tvStartHeadlines.setVisibility(View.VISIBLE); } else { tvStartHeadlines.setVisibility(View.INVISIBLE); } } }; /** * 改变点点点的切换效果 * @param selectItems */ private void setImageBackground(int selectItems) { for (int i = 0; i < tips.length; i++) { if (i == selectItems) { tips[i].setBackgroundResource(R.drawable.page_indicator_focused); } else { tips[i].setBackgroundResource(R.drawable.page_indicator_unfocused); } } } @Override public void gotoMain() { Intent intent = new Intent(this, MainActivity.class); startActivity(intent); finish(); } private boolean isFirst() { SharedPreferences setting = getSharedPreferences("headlines", 0); Boolean user_first = setting.getBoolean("FIRST", true); if (user_first) {
// 第一次 setting.edit().putBoolean("FIRST", false).commit(); return true; } else { return false; } }}

3).LauncherPagerAdapter 继承PagerAdapter,在构造函数中初始化要显示的所有页面,其他的跟普通的适配器没啥区别,就多了两个重写的方法,destroyItem跟instantiateItem。destroyItem是删除一个页面,instantiateItem是加载一个页面。。

/** * ViewPager适配器 * @author ansen * @create time 2016-04-15 */public class LauncherPagerAdapter extends PagerAdapter implements OnClickListener{    private ILauncherView launcherView;        private List
views; //每页显示的图片 private int[] images=new int[]{R.drawable.tutorial_1,R.drawable.tutorial_2,R.drawable.tutorial_3,R.drawable.tutorial_4}; public LauncherPagerAdapter(Context context,ILauncherView launcherView){ views=new ArrayList
(); this.launcherView=launcherView; //初始化每页显示的View for(int i=0;i
getViews() { return views; } @Override public int getCount() { return views == null ? 0 : views.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0==arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object){ ((ViewPager) container).removeView(views.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) { ((ViewPager) container).addView(views.get(position), 0); return views.get(position); } @Override public void onClick(View v) { launcherView.gotoMain(); }}

4).还有每一页显示的item布局,以及“开启我的头条”按钮的背景shape我就不一一贴出来了。有兴趣的可以自行去下载demo。

你可能感兴趣的文章
【运维趟坑回忆录 开篇】初入初创, 一脸懵
查看>>
你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
查看>>
Prometheus VS InfluxDB
查看>>
《码出高效》学习笔记与书中错误记录
查看>>
东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
查看>>
翻译 | The Principles of OOD 面向对象设计原则
查看>>
个推基于Consul的配置管理
查看>>
zabbix安装
查看>>
阿里云RDS PostgreSQL GPU加速规格(支持GIS时空加速)发布
查看>>
Netflix Media Database - 架构设计和实现
查看>>
云HBase Spark分析引擎对接云数据库POLARDB
查看>>
揭秘 DockerCon 重量级演讲嘉宾(六)
查看>>
性能优化技巧 - 集群维表
查看>>
python 静态文件以及一个项目框架
查看>>
组复制官方翻译七、Requirements and Limitations
查看>>
2019年4月上旬值得一读的10本技术书籍(Python、大数据、深度学习等)!
查看>>
微信钱包入口开发笔记
查看>>
[error] 17755#0: *58522 readv() failed (104: Connection reset by peer) while reading upstream
查看>>
如何从CRM中获益?看专家怎么说!
查看>>
捷信达会员管理系统SQL语句相关
查看>>