1. 程式人生 > >android自定義組合控制元件圖片輪播+小圓點+點選跳轉廣告頁面

android自定義組合控制元件圖片輪播+小圓點+點選跳轉廣告頁面

1.寫一個佈局,用於自定義組合控制元件

<?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="200dp">
<!--圖片輪播-->
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="200dp"></android.support.v4.view.ViewPager>
<!--展示小圓點-->
    <LinearLayout
        android:id="@+id/llt"
        android:background="#999999"
        android:gravity="center"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="40dp"></LinearLayout>
</RelativeLayout>
2.寫一個類繼承RelativeLayout,也就是自定義組合控制元件的類
public class AutoBanner extends RelativeLayout {
    DianJi dianji;
    private ViewPager viewPager;
    private LinearLayout llt;
    private Myhandler h;

    public AutoBanner(Context context) {
        this(context,null);
    }

    public AutoBanner(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public AutoBanner(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //將佈局繪製到控制元件
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.mybanner, this, true);
        //通過id獲取控制元件
        viewPager = view.findViewById(R.id.viewpager);
        llt = view.findViewById(R.id.llt);
    }

    //寫一個獲取資料的方法,同時獲取介面卡
    public void setAdaper(Context context,List<com.bwie.zengxianglin1511j20180102.bean.DataBean> data){
         Myadaper m=new Myadaper(context,data);
         viewPager.setAdapter(m);

         //寫一個集合用於放指示器,也就是小圓點
         final List<ImageView> yuandian=new ArrayList();
        //有多少圖片放幾個圓點
        for (int i = 0; i < data.size(); i++) {
            ImageView yuan=new ImageView(context);
            //給圖片新增選中和未選中的狀態
            yuan.setBackgroundResource(R.drawable.dot_drawable);
            //新增到集合
            yuandian.add(yuan);
            //這是佈局引數,,剛開始小圓點之間沒有距離,所以使用java程式碼指定寬度高度,並且指定小圓點之間的距離
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
            params.setMargins(5,0,5,0);
            //放到LinearLayout,也就是圓點佈局中
            llt.addView(yuan,params);
        }
        //預設第一個選中
        yuandian.get(0).setSelected(true);
        //給viewpager新增滑動監聽
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                position=position%yuandian.size();
                for (int i = 0; i <yuandian.size(); i++) {
                    //如果滑動的圖片下標等於圓點下標就是圓點選中
                    if(i==position){
                        yuandian.get(i).setSelected(true);
                    }else{
                        //不等於就不選中
                        yuandian.get(i).setSelected(false);
                    }
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        //2.手動的可以無限滑動  可以左滑
        viewPager.setCurrentItem(yuandian.size()*100000);//設定當前展示中間某個足夠大的位置
        //設定自動輪播
        h = new Myhandler();
         autoPlay();
    }

    private void autoPlay() {
          h.sendEmptyMessageDelayed(0,2000);
    }

    //自動輪播
    class  Myhandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //顯示下一頁的訊息
            viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
            //再次傳送
            h.sendEmptyMessageDelayed(0,2000);
        }
    }

    //介面卡
    class Myadaper extends PagerAdapter{
        Context con;
        List<com.bwie.zengxianglin1511j20180102.bean.DataBean> data;

        public Myadaper(Context con,List<com.bwie.zengxianglin1511j20180102.bean.DataBean> data){
                  this.con=con;
                  this.data=data;
        }
        /**
         * viewPager具有預載入,預設的前後載入一頁,,,預設的容器裡面最多三頁
         * @param container
         * @param position
         * @return
         */
        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
            //寫一個ImageView控制元件
            ImageView iv=new ImageView(con);
            //給控制元件設定圖片
            Glide.with(con).load(data.get(position%data.size()).getIcon()).into(iv);
            //新增到容器當中
            container.addView(iv);

            //給imageView設定觸控的監聽事件,再點選的時候要暫停傳送
            iv.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    switch (motionEvent.getAction()){
                        case MotionEvent.ACTION_DOWN://按下的時候應該取消傳送訊息的操作
                            h.removeCallbacksAndMessages(null);
                        break;
                        case MotionEvent.ACTION_MOVE://移動的動作
                            h.removeCallbacksAndMessages(null);
                        break;
                        case MotionEvent.ACTION_CANCEL://取消
                            h.sendEmptyMessageDelayed(0,2000);
                        break;
                        case MotionEvent.ACTION_UP://擡起的時候
                            h.sendEmptyMessageDelayed(0,2000);
                            break;
                    }
                    return false;
                }
            });

            //設定ImageView的點選事件,用於介面回撥傳值
            iv.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                    //因為是無線輪播,所以要魔除集合長度再能獲取正常下標
                    dianji.dian(position%data.size());
                }
            });
            //2.把當前展示的檢視返回
            return iv;
        }

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

        @Override
        public int getCount() {
            return Integer.MAX_VALUE;//設定成最大,無限輪播
        }

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


    //寫一個介面,用於ImageView點選事件
    public interface DianJi{
        void dian(int position);
    }
    //寫一個方法供外部訪問
    public void  fang(DianJi dianji){
        this.dianji=dianji;
    }
}
3.小圓點的xml佈局背景   res右鍵Android  resource file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@drawable/dot_select"></item>
    <item android:state_selected="false" android:drawable="@drawable/dot_no_select"></item>
</selector>

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <size android:width="10dp" android:height="10dp"/>
    <solid android:color="#fff"/>
</shape>

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <size android:width="10dp" android:height="10dp"/>
    <solid android:color="#82B34E"/>
</shape>

4.mainACtivity的佈局和應用

  //佈局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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.bwie.zengxianglin1511j20180102.MainActivity">

    <com.bwie.zengxianglin1511j20180102.AutoBanner
        android:id="@+id/myban"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></com.bwie.zengxianglin1511j20180102.AutoBanner>

</LinearLayout>

//應用
public class MainActivity extends AppCompatActivity implements AutoBanner.DianJi{
    private List<bean.DataBean> data;
    private AutoBanner myban;
    String url="https://www.zhaoapi.cn/ad/getAd";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //通過id獲取控制元件
        myban = findViewById(R.id.myban);
        //獲取資料
        getDate();
        //介面回撥
        myban.fang(this);
    }

    private void getDate() {
        //非同步請求資料
        new MyAsyncTask().execute(url);
    }
    //實現介面,用於接收值
    @Override
    public void dian(int position) {
        //type:返回0或1
        //0 跳轉到Webview詳情頁
        //1 Toast彈出提示“我要跳轉到商品詳情頁”
        int type = data.get(position).getType();
        if(type==0){
            Intent in=new Intent(MainActivity.this,Main2Activity.class);
            in.putExtra("url",data.get(position).getUrl());
            startActivity(in);
        }else if(type==1){
            Toast.makeText(MainActivity.this,"我要跳轉到商品詳情頁", Toast.LENGTH_SHORT).show();
        }
    }

    private class MyAsyncTask extends AsyncTask<String,Void,String>{

        @Override
        protected String doInBackground(String... strings) {
            //調取工具類請求資料
            return Util.tojson(strings[0]);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            //解析JSON
            Gson g=new Gson();
            bean bean = g.fromJson(s, bean.class);
            data = bean.getData();
            //調取自定義控制元件的方法,給自定義ViewPager新增資料
            myban.setAdaper(MainActivity.this, data);
        }
    }
}
//點選圖片跳轉到詳情頁面的activity

//佈局

<android.support.constraint.ConstraintLayout 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.bwie.zengxianglin1511j20180102.Main2Activity"
    >
    //展示網頁
    <WebView
        android:id="@+id/mWebView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></WebView>

</android.support.constraint.ConstraintLayout>
//應用
public class Main2Activity extends AppCompatActivity {
    WebView mWebView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        Intent intent = getIntent();
        String url = intent.getStringExtra("url");
        Toast.makeText(Main2Activity.this,url+"aaaa",Toast.LENGTH_LONG).show();

        mWebView = (WebView) findViewById(R.id.mWebView);
        mWebView.loadUrl(url);
        mWebView.requestFocusFromTouch();
        mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        /**覆蓋呼叫系統或自帶瀏覽器行為開啟網頁*/
        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // TODO Auto-generated method stub
                view.loadUrl(url);
                return true;
            }
        });
        /**判斷載入過程*/
        mWebView.setWebChromeClient(new WebChromeClient() {
                    @Override
                    public void onProgressChanged(WebView view, int newProgress) {
                        // TODO Auto-generated method stub
                        if (newProgress == 100) {
                            // 網頁載入完成

                        } else {
                            // 載入中

                        }
            }
        });

        initListener();
    }

    private void initListener() {
        /**開啟頁面時, 自適應螢幕*/
        WebSettings webSettings =   mWebView .getSettings();
        webSettings.setUseWideViewPort(true);//設定此屬性,可任意比例縮放
        webSettings.setLoadWithOverviewMode(true);

        /**便頁面支援縮放*/
        webSettings.setJavaScriptEnabled(true);
        webSettings.setBuiltInZoomControls(true);
        webSettings.setSupportZoom(true);
    }
}