App新功能介绍画面的两种实现方式

作者: RickGe | 来源:发表于2016-11-12 17:09 被阅读473次

实现方式一

  • 01 效果图 (黑马-智慧北京)
SmartBeiJing.png
  • 02 layout
activity_guide.xml
<?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.support.v4.view.ViewPager
            android:id="@+id/vp_guide"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
   <RelativeLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="30dp">
       <LinearLayout 
        android:id="@+id/ll_point"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"/>
       <ImageView 
           android:id="@+id/iv_red_point"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:src="@drawable/circle_red"/>
   </RelativeLayout>
</RelativeLayout>
guide_vp_item.xml
<?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" >
    <TextView
        android:id="@+id/tv_start_use"
        android:layout_width="100dp"
        android:layout_height="36dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="70dp"
        android:background="@drawable/guide_tv"
        android:gravity="center"
        android:text="@string/start_use"
        android:textColor="@color/tv_white"
        android:textSize="18sp"
        android:visibility="gone" />
</RelativeLayout>
  • 03 activity
public class GuideActivity extends Activity {
    private Context mContext;
    int[] mGuidePicture = new int[]{R.drawable.guide_1, R.drawable.guide_2, R.drawable.guide_3};
    private int mPointDis;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guide);
        mContext = this;
        initUI();
    }

    private void initUI() {
        ViewPager vp_guide = (ViewPager) findViewById(R.id.vp_guide);
        vp_guide.setAdapter(new GuidePagerAdapter());
        final LinearLayout ll_point = (LinearLayout) findViewById(R.id.ll_point);
        final ImageView iv_red_point = (ImageView) findViewById(R.id.iv_red_point);
        
        // 添加灰色小圆点
        ImageView imageView;
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                                                        LinearLayout.LayoutParams.WRAP_CONTENT, 
                                                        LinearLayout.LayoutParams.WRAP_CONTENT);
        layoutParams.leftMargin = 20;
        
        for(int i = 0; i < mGuidePicture.length; i ++){
            imageView = new ImageView(mContext);
            imageView.setImageResource(R.drawable.circle_gray);
            if(i != 0){
                imageView.setLayoutParams(layoutParams);
            }
            
            ll_point.addView(imageView);
        }
        
        // 监听layout方法结束的事件,位置确定好之后再获取圆点间距
        // 视图树
        iv_red_point.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                // 移除监听,避免重复回调
                iv_red_point.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                // iv_red_point.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                // layout方法执行结束的回调
                mPointDis = ll_point.getChildAt(1).getLeft() - ll_point.getChildAt(0).getLeft();
                System.out.println("圆点距离:" + mPointDis);
            }
        });
        
        // 设置滑动事件监听
        vp_guide.setOnPageChangeListener(new OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
            }
            @Override
            public void onPageScrolled(int position,float positionOffset, int positionOffsetPixels) {
                // 更新小红点距离
                // 计算小红点当前的左边距
                int leftMargin = (int) (mPointDis * positionOffset) + position * mPointDis;
                RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) iv_red_point.getLayoutParams();
                // 修改左边距
                params.leftMargin = leftMargin;
                // 重新设置布局参数
                iv_red_point.setLayoutParams(params);
            }
            
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });
    }
    
    class GuidePagerAdapter extends PagerAdapter{
        private ArrayList<View> mGuideViewList;

        public GuidePagerAdapter(){
            initData();
        }
        
        private void initData() {
            View view;
            mGuideViewList = new ArrayList<View>();
            for(int i = 0; i < mGuidePicture.length; i ++){
                view = View.inflate(mContext, R.layout.guide_vp_item, null);
                view.setBackgroundResource(mGuidePicture[i]);
                if(i == mGuidePicture.length - 1){
                    TextView tv_start_use = (TextView) view.findViewById(R.id.tv_start_use);
                    tv_start_use.setVisibility(View.VISIBLE);
                    tv_start_use.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Toast.makeText(mContext, "Hello world", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
                mGuideViewList.add(view);
            }
        }

        @Override
        public int getCount() {
            return mGuideViewList.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view = mGuideViewList.get(position);
            container.addView(view);
            return view;
        }
        
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object); 
        }
    }
}

实现方式二

  • 01 效果图(申通快递)
sto.png
activity_guide.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
   <android.support.v4.view.ViewPager
            android:id="@+id/vp_guide"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
   <com.viewpagerindicator.CirclePageIndicator
        android:id="@+id/indicator"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="30dp"
        android:padding="5dp"
        app:radius="5dp"
        app:fillColor="#ff0000"
        app:pageColor="#666666"/>
</RelativeLayout>
guide_vp_item.xml
<?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" >
    <TextView
        android:id="@+id/tv_start_use"
        android:layout_width="100dp"
        android:layout_height="36dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="70dp"
        android:background="@drawable/guide_tv"
        android:gravity="center"
        android:text="@string/start_use"
        android:textColor="@color/tv_white"
        android:textSize="18sp"
        android:visibility="gone" />
</RelativeLayout>
  • 03 activity
public class GuideActivity extends Activity {
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guide);
        mContext = this;
        initUI();
    }

    private void initUI() {
        ViewPager vp_guide = (ViewPager) findViewById(R.id.vp_guide);
        vp_guide.setAdapter(new GuidePagerAdapter());
        // 开源控件viewpagerindicator下CirclePageIndicator的使用
        PageIndicator mIndicator = (CirclePageIndicator) findViewById(R.id.indicator);
        mIndicator.setViewPager(vp_guide);
    }

    class GuidePagerAdapter extends PagerAdapter {
        private ArrayList<View> mGuideViewList;

        public GuidePagerAdapter() {
            initData();
        }

        private void initData() {
            mGuideViewList = new ArrayList<View>();
            int[] guidePicture = new int[] { 
                    R.drawable.guide1,
                    R.drawable.guide2, 
                    R.drawable.guide3,
                    R.drawable.guide4
                };
            
            View view;
            for (int i = 0; i < guidePicture.length; i++) {
                view = View.inflate(mContext, R.layout.guide_vp_item, null);
                view.setBackgroundResource(guidePicture[i]);
                if (i == guidePicture.length - 1) {
                    TextView tv_start_use = (TextView) view.findViewById(R.id.tv_start_use);
                    tv_start_use.setVisibility(View.VISIBLE);
                    tv_start_use.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Toast.makeText(mContext, "Hello world",Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                mGuideViewList.add(view);
            }
        }

        @Override
        public int getCount() {
            return mGuideViewList.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view = mGuideViewList.get(position);
            container.addView(view);
            return view;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }
}

相关文章

网友评论

    本文标题:App新功能介绍画面的两种实现方式

    本文链接:https://www.haomeiwen.com/subject/faeqpttx.html