Android自定义控件(一)

一 、自定义控件的一些概念

        1、什么是自定义控件

             在Android系统中,用系统的自带控件重新组合或者自定义类继承View或者自定义类继承ViewGroup,实现特定的UI效 果。

        2、为什么要学习自定义控件

               (1)系统的某些控件在不同设备显示效果不一样(android系统版本影响,或者各手机场上的UI优化)。

               (2)整个软件在不同设备风格统一

               (3)系统自带的控件功能有限,增加功能或功能太多,减少功能 。

        3、自定义控件的重要性

                (1)View和ViewGrop的区别

                (2)Android的时间传递

                (3)View的原理

二、 自定义控件的分类

          1、 系统控件重新组合

          2、自定义类继承View

          3、自定义类继承VeiwGroup

三、 自定义控件实例

          系统控件重新组合(ViewPager的使用)

          主要功能实现ViewPager自动无限轮播,并加入当前页标记原点。效果图如下

          

         Android自定义控件(一)

          

package com.zcwang.viewpager;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;
    private LinearLayout mPointContainer;
    private int mPrePosition;
    private int [] images = new int[]{R.drawable.a1,R.drawable.a2,R.drawable.a3,
            R.drawable.a4, R.drawable.a5,R.drawable.a6,R.drawable.a7,
            R.drawable.a8,R.drawable.a9};

    private List<ImageView> imageViewList;

    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            int item = mViewPager.getCurrentItem()+1;
            mViewPager.setCurrentItem(item);
            mHandler.sendEmptyMessageDelayed(0,4000);
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager = (ViewPager) findViewById(R.id.view_pager);
        mPointContainer = (LinearLayout) findViewById(R.id.vp_point_container);
        imageViewList = new ArrayList<>();
        for (int i= 0;i<images.length;i++){
            ImageView image=new ImageView(this);
            image.setBackgroundResource(images[i]);
            imageViewList.add(image);
            ImageView point = new ImageView(this);
            point.setBackgroundResource(R.drawable.point_selector);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(dip2px(this,8),dip2px(this,8));
            params.leftMargin = dip2px(this,8);
            if (i==0){
                 point.setEnabled(true);
            }else {
                point.setEnabled(false);
                point.setLayoutParams(params);
            }
            mPointContainer.addView(point);
        }
        mViewPager.setAdapter(new MyViewPagerAdapter());
        mViewPager.setCurrentItem(Integer.MAX_VALUE/2);
        mViewPager.setOnPageChangeListener(new MyViewPagerChangeListener());
        mHandler.sendEmptyMessageDelayed(0,4000);
    }

    private class MyViewPagerAdapter extends PagerAdapter {
        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            int realPosition = position%images.length;
            ImageView image = imageViewList.get(realPosition);
            image.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            mHandler.removeCallbacksAndMessages(null);
                            break;
                        case MotionEvent.ACTION_UP:
                            mHandler.removeCallbacksAndMessages(null);
                            mHandler.sendEmptyMessageDelayed(0,4000);
                            break;

                    }
                    return true;
                }
            });
            container.addView(image);
            return image;
        }

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

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

    public static int dip2px(Context context, float dpValue) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }


    private class MyViewPagerChangeListener implements ViewPager.OnPageChangeListener {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            int realPosition = position%images.length;
            mPointContainer.getChildAt(mPrePosition).setEnabled(false);
            mPointContainer.getChildAt(realPosition).setEnabled(true);
            mPrePosition = realPosition;
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == ViewPager.SCROLL_STATE_DRAGGING){
                mHandler.removeCallbacksAndMessages(null);
            }else if (state ==ViewPager.SCROLL_STATE_IDLE){
                mHandler.removeCallbacksAndMessages(null);
                mHandler.sendEmptyMessageDelayed(0,4000);
            }

        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler.removeCallbacksAndMessages(null);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <size android:height="8dp"
        android:width="8dp"/>
    <solid android:color="#44000000"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    <size android:height="8dp"
        android:width="8dp"/>
    <solid android:color="#ff0000"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:drawable="@drawable/point_normal"/>
    <item android:state_enabled="true" android:drawable="@drawable/point_select"/>
</selector>
    
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.zcwang.viewpager.MainActivity">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="200dp">
        <android.support.v4.view.ViewPager
            android:id="@+id/view_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_alignParentBottom="true">
            <TextView
                android:id="@+id/vp_text"
                android:layout_gravity="center_horizontal"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="454646545646465464"/>
            <LinearLayout
                android:orientation="horizontal"
                android:id="@+id/vp_point_container"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal" />
        </LinearLayout>
    </RelativeLayout>
</RelativeLayout>