Android實踐之簡單Banner

之所以說簡單是,還有很多地方需要優化,比如最後一頁到一次性滾動到最後一頁沒有做,從第一頁直接選擇第五頁好像有卡頓現象,RadioButton也需要優化。。。。

 

下載地址:https://download.csdn.net/download/chicaidecaiji/12439401

代碼如下:

  1. MainActivity.java
    package com.example.indicator;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
        private Banner mBanner;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initCtrls();
        }
    
        private void initCtrls() {
            mBanner = findViewById(R.id.banner);
            mBanner.initialize(getSupportFragmentManager());
        }
    }
    

     

  2. Banner.java
    package com.example.indicator;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.GridLayout;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;
    import android.widget.RelativeLayout;
    
    import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    import androidx.fragment.app.FragmentManager;
    import androidx.viewpager.widget.ViewPager;
    
    public class Banner extends RelativeLayout implements RadioGroup.OnCheckedChangeListener {
        private final String TAG = getClass().getSimpleName();
        private Context mContext;
    
        private ViewPager mViewPagerBanner;
        private RadioGroup mRadioGroup;
        private int mPagerCount = 0;
        private int mCurSelect = -1;
    
        private BannerAdapter mBannerAdapter;
        public Banner(@NonNull Context context) {
            super(context);
            mContext = context;
        }
    
        public Banner(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            mContext = context;
        }
    
        public Banner(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            mContext = context;
        }
    
        public Banner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            mContext = context;
        }
    
    
        public void initialize(FragmentManager fm) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.view_banner, null);
            mViewPagerBanner = view.findViewById(R.id.viewpager_banner);
            mRadioGroup = view.findViewById(R.id.rg_banner_buttons);
            addView(view);
    
            BannerAdapter adapter = new BannerAdapter(fm);
            mViewPagerBanner.setAdapter(adapter);
            mViewPagerBanner.addOnPageChangeListener(new OnBannerViewPagerChangedListener());
    
            mPagerCount = adapter.getCount();
            initRadioGroup(mPagerCount);
    
            mViewPagerBanner.setCurrentItem(0);
            selectRadioButton(0);
        }
    
        private void initRadioGroup(int count) {
            for (int i = 0; i < count; i++) {
                RadioButton button = new RadioButton(mContext);
                RadioGroup.LayoutParams lp = new RadioGroup.LayoutParams(200, RadioGroup.LayoutParams.MATCH_PARENT);
                lp.gravity = Gravity.CENTER;
                button.setLayoutParams(lp);
                button.setGravity(Gravity.CENTER);
                mRadioGroup.addView(button);
            }
            mRadioGroup.setOnCheckedChangeListener(this);
    
        }
    
        private class OnBannerViewPagerChangedListener implements ViewPager.OnPageChangeListener {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
            }
    
            @Override
            public void onPageSelected(int position) {
                selectRadioButton(position);
            }
    
            @Override
            public void onPageScrollStateChanged(int state) {
                // TODO
            }
        }
    
        private void selectRadioButton(int position) {
            if (mCurSelect == position) {
                return;
            }
    
            if (position >= mPagerCount) {
                return;
            }
    
            mCurSelect = position;
            ((RadioButton)mRadioGroup.getChildAt(position)).setChecked(true);
        }
    
        @Override
        public void onCheckedChanged(RadioGroup radioGroup, int i) {
            mViewPagerBanner.setCurrentItem(i - 1);
        }
    }
    

     

  3. BannerAdapter.java
    package com.example.indicator;
    
    import androidx.annotation.NonNull;
    import androidx.fragment.app.Fragment;
    import androidx.fragment.app.FragmentManager;
    import androidx.fragment.app.FragmentPagerAdapter;
    
    import java.util.ArrayList;
    
    public class BannerAdapter extends FragmentPagerAdapter {
        private ArrayList<String> mTitleList = new ArrayList<>();
        public BannerAdapter(FragmentManager fm) {
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
            mTitleList.add("頁面1");
            mTitleList.add("頁面2");
            mTitleList.add("頁面3");
            mTitleList.add("頁面4");
            mTitleList.add("頁面5");
        }
    
        @NonNull
        @Override
        public Fragment getItem(int position) {
            return new TestFragment(mTitleList.get(position));
        }
    
        @Override
        public int getCount() {
            return mTitleList.size();
        }
    }
    

     

  4. TestFragment.java
    package com.example.indicator;
    
    import android.view.View;
    import android.view.LayoutInflater;
    import android.view.ViewGroup;
    import android.os.Bundle;
    import android.widget.TextView;
    
    import androidx.fragment.app.Fragment;
    
    public class TestFragment extends Fragment {
        private String mTitle;
        public TestFragment(String title) {
            mTitle = title;
        }
    
        private TextView tvFragmentTitle;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_test, null);
        }
    
        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
    
            tvFragmentTitle = (TextView) view.findViewById(R.id.tv_fragment_title);
            tvFragmentTitle.setText(mTitle);
        }
    
    }
    

     

  5. activity_main.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"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <com.example.indicator.Banner
            android:background="@color/colorAccent"
            android:id="@+id/banner"
            android:layout_width="match_parent"
            android:layout_height="500dp">
        </com.example.indicator.Banner>
    
    </RelativeLayout>

     

  6. view_banner.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">
        <androidx.viewpager.widget.ViewPager
            android:background="@color/colorPrimary"
            android:id="@+id/viewpager_banner"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
        <RelativeLayout
            android:id="@+id/layout_banner_Radio_group"
            android:layout_alignParentBottom="true"
            android:layout_width="match_parent"
            android:layout_height="80dp">
            <RadioGroup
                android:id="@+id/rg_banner_buttons"
                android:orientation="horizontal"
                android:layout_alignParentBottom="true"
                android:layout_centerInParent="true"
                android:layout_width="wrap_content"
                android:layout_height="80dp"></RadioGroup>
        </RelativeLayout>
    
    </RelativeLayout>

     

  7. fragment_test.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:background="#666666"
        android:layout_height="match_parent"
        android:layout_margin="100dp">
        <TextView
            android:id="@+id/tv_fragment_title"
            android:layout_gravity="center"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

     

  8. styles.xml
    <resources>
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
        </style>
        <declare-styleable name="Banner">
        </declare-styleable>
        <declare-styleable name="PagerIndicator">
        </declare-styleable>
    </resources>
    

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章