之所以說簡單是,還有很多地方需要優化,比如最後一頁到一次性滾動到最後一頁沒有做,從第一頁直接選擇第五頁好像有卡頓現象,RadioButton也需要優化。。。。
下載地址:https://download.csdn.net/download/chicaidecaiji/12439401
代碼如下:
- 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()); } }
- 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); } }
- 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(); } }
- 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); } }
- 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>
- 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>
- 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>
- 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>