{"id":18918086,"url":"https://github.com/dengbocong/welcomepage","last_synced_at":"2025-04-15T09:32:18.403Z","repository":{"id":108532116,"uuid":"155848773","full_name":"DengBoCong/WelcomePage","owner":"DengBoCong","description":"工作之余写了一个引导页+启动页的小Demo，代码进行了非常详细的标注。可以说是一个小的案例教学了。PS：理解初学Android时痛苦，所以现在在Android上略窥门径的时候，回过头来写一些小Demo，希望能够帮助到需要的人。","archived":false,"fork":false,"pushed_at":"2018-11-02T16:30:03.000Z","size":1054,"stargazers_count":15,"open_issues_count":1,"forks_count":3,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-03-28T19:44:39.430Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DengBoCong.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-02T10:10:53.000Z","updated_at":"2022-11-13T03:10:20.000Z","dependencies_parsed_at":"2023-03-26T01:17:15.630Z","dependency_job_id":null,"html_url":"https://github.com/DengBoCong/WelcomePage","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DengBoCong%2FWelcomePage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DengBoCong%2FWelcomePage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DengBoCong%2FWelcomePage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DengBoCong%2FWelcomePage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DengBoCong","download_url":"https://codeload.github.com/DengBoCong/WelcomePage/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249043006,"owners_count":21203398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T10:29:34.885Z","updated_at":"2025-04-15T09:32:18.391Z","avatar_url":"https://github.com/DengBoCong.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WelcomePage\n工作之余写了一个引导页+启动页的小Demo，代码进行了非常详细的标注。可以说是一个小的案例教学了。PS：理解初学Android时痛苦，所以现在在Android上略窥门径的时候，回过头来写一些小Demo，希望能够帮助到需要的人。\n废话不多说，这次讲解APP的引导页启动页，我使用在代码中加入详细的注释的方式进行讲解，对于以下不经常出现的API我都进行了注解，接下来直接开始吧。\nWelcomeActivity.java\n\npackage com.example.power.welcomepage;\n \nimport android.app.Activity;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.os.Bundle;\nimport android.os.Handler;\n \nimport com.example.power.welcomepage.Activity.MainActivity;\nimport com.example.power.welcomepage.Activity.WelcomeGuideActivity;\nimport com.example.power.welcomepage.Util.SharedPreferencesUtil;\n \npublic class WelcomeActivity extends Activity {\n \n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        /*首先启动该Activity，并判断是否是第一次启动,注意，需要添加默认值,\n        * 如果是第一次启动，则先进入功能引导页*/\n        boolean isFirstOpen = SharedPreferencesUtil.getBoolean(this, SharedPreferencesUtil.FIRST_OPEN, true);\n        if(isFirstOpen){\n            Intent intent = new Intent(this, WelcomeGuideActivity.class);\n            startActivity(intent);\n            /*注意，需要使用finish将该activity进行销毁，否则，在按下手机返回键时，会返回至启动页*/\n            finish();\n            return;\n        }\n        /*如果不是第一次启动app，则启动页*/\n        setContentView(R.layout.activity_welcome);\n \n        new Handler().postDelayed(new Runnable() {\n            @Override\n            public void run() {\n                /*2秒后进入主页*/\n                enterHomeActivity();\n            }\n        },2000);\n    }\n \n    private void enterHomeActivity(){\n        Intent intent = new Intent(this, MainActivity.class);\n        startActivity(intent);\n        finish();\n    }\n}\n\nWelcomeGuideActivity.java\n\npackage com.example.power.welcomepage.Activity;\n \nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.view.ViewPager;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\n \nimport com.example.power.welcomepage.Adapter.GuideViewPagerAdapter;\nimport com.example.power.welcomepage.R;\nimport com.example.power.welcomepage.Util.SharedPreferencesUtil;\nimport com.example.power.welcomepage.WelcomeActivity;\n \nimport java.util.ArrayList;\nimport java.util.List;\n \n/**\n * Created by Power on 2018/11/2.\n */\n \npublic class WelcomeGuideActivity extends Activity implements View.OnClickListener {\n    private ViewPager viewPager;\n    private GuideViewPagerAdapter adapter;\n    private List\u003cView\u003e views;\n    private Button startBtn;\n \n    /*引导页图片资源*/\n    private static final int[] pics = {  R.layout.guid_view1,\n            R.layout.guid_view2, R.layout.guid_view3, R.layout.guid_view4 };\n \n    /*底部小点图片*/\n    private ImageView[] dots;\n \n    /*用于记录当前选中位置*/\n    private int currentIndex;\n \n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_guide);\n \n        views = new ArrayList\u003cView\u003e();\n \n        /*初始化引导页视图列表,需要对资源进行处理*/\n        for(int i = 0; i \u003c pics.length; i++){\n            View view = LayoutInflater.from(this).inflate(pics[i], null);\n \n            if(i == pics.length - 1){\n                startBtn = (Button)view.findViewById(R.id.btn_login);\n                /*这里使用setTag方法进行标注。在View中的setTag(Onbect)表示给View\n                添加一个格外的数据，以后可以用getTag()将这个数据取出来。可以用在\n                多个Button添加一个监听器，每个Button都设置不同的setTag。这个监听\n                器就通过getTag来分辨是哪个Button 被按下。*/\n                startBtn.setTag(\"enter\");\n                startBtn.setOnClickListener(this);\n            }\n            views.add(view);\n        }\n \n        viewPager = (ViewPager)findViewById(R.id.vp_guide);\n        /*初始化adapter*/\n        adapter = new GuideViewPagerAdapter(views);\n        viewPager.setAdapter(adapter);\n        /*需要设置页面改变的监听器，这样我们能把我页面改变时的具体操作细节，所以\n        需要创建PageChangeListener，实现OnPageChangeListener接口*/\n        viewPager.addOnPageChangeListener(new PageChangeListener());\n        initDots();\n    }\n \n    @Override\n    protected void onResume() {\n        super.onResume();\n    }\n \n    @Override\n    protected void onPause() {\n        super.onPause();\n        /*如果切换到后台，就设置下次不进入功能引导页*/\n        SharedPreferencesUtil.setBoolean(WelcomeGuideActivity.this, SharedPreferencesUtil.FIRST_OPEN, false);\n        finish();\n    }\n \n    @Override\n    protected void onStop() {\n        super.onStop();\n    }\n \n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n    }\n \n    private void initDots(){\n        LinearLayout linearLayout = (LinearLayout)findViewById(R.id.ll);\n        dots = new ImageView[pics.length];\n \n        /*循环取得小点图片*/\n        for(int i = 0; i \u003c pics.length; i++){\n            /*得到一个LinearLayout下面的每一个子元素*/\n            dots[i] = (ImageView)linearLayout.getChildAt(i);\n            dots[i].setEnabled(false);//设置成灰色\n            dots[i].setOnClickListener(this);\n            dots[i].setTag(i);//设置位置tag，方便取出与当前位置对应,原理同上\n        }\n        currentIndex = 0;\n        dots[currentIndex].setEnabled(true); // 设置为白色，即选中状态\n    }\n \n    /**\n     * 设置当前view\n     *\n     * @param position\n     */\n    private void  setCurrentView(int position){\n        if(position \u003c 0 || position \u003e pics.length){\n            return;\n        }\n        viewPager.setCurrentItem(position);\n    }\n \n    /**\n     * 设置当前指示点\n     *\n     * @param position\n     */\n    private void setCurDot(int position) {\n        if (position \u003c 0 || position \u003e pics.length || currentIndex == position) {\n            return;\n        }\n        dots[position].setEnabled(true);\n        dots[currentIndex].setEnabled(false);\n        currentIndex = position;\n    }\n \n    @Override\n    public void onClick(View v) {\n        if(v.getTag().equals(\"enter\")){\n            enterMainActivity();\n            return;\n        }\n        int position = (Integer) v.getTag();\n        setCurrentView(position);\n        setCurDot(position);\n    }\n \n    private void enterMainActivity(){\n        Intent intent = new Intent(WelcomeGuideActivity.this, WelcomeActivity.class);\n        startActivity(intent);\n        SharedPreferencesUtil.setBoolean(WelcomeGuideActivity.this, SharedPreferencesUtil.FIRST_OPEN, false);\n        finish();\n    }\n \n    private class PageChangeListener implements ViewPager.OnPageChangeListener{\n        /*当滑动状态改变时调用*/\n \n        @Override\n        public void onPageScrollStateChanged(int state) {\n            /*arg0 ==1的时辰默示正在滑动，arg0==2的时辰默示滑动完毕了，arg0==0的时辰默示什么都没做。*/\n        }\n \n        /*当前页面被滑动时调用*/\n \n        @Override\n        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {\n            // arg0 :当前页面，及你点击滑动的页面\n            // arg1:当前页面偏移的百分比\n            // arg2:当前页面偏移的像素位置\n        }\n \n        /*当新的页面被选中时调用*/\n        @Override\n        public void onPageSelected(int position) {\n            setCurDot(position);\n        }\n    }\n}\n\n具体细节参见详细源码哦，里面有详细的注解，希望能够帮到你。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdengbocong%2Fwelcomepage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdengbocong%2Fwelcomepage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdengbocong%2Fwelcomepage/lists"}