必要なのは、 ViewPager 、 TabLayout および選択された2つのドロアブルです。デフォルトのドット.
まず、画面レイアウトにTabLayout
を追加し、それをViewPager
に接続する必要があります。これには2つの方法があります。
TabLayout
に入れ子になったViewPager
<Android.support.v4.view.ViewPager
Android:id="@+id/photos_viewpager"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.design.widget.TabLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
</Android.support.v4.view.ViewPager>
この場合、
TabLayout
は自動的にViewPager
に接続されますが、TabLayout
はその上ではなく、ViewPager
の隣になります。
TabLayout
<Android.support.v4.view.ViewPager
Android:id="@+id/photos_viewpager"
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>
<Android.support.design.widget.TabLayout
Android:id="@+id/tab_layout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
この場合、
TabLayout
を任意の場所に置くことができますが、TabLayout
をViewPager
にプログラム的に接続する必要があります。
ViewPager pager = (ViewPager) view.findViewById(R.id.photos_viewpager);
PagerAdapter adapter = new PhotosAdapter(getChildFragmentManager(), photosUrl);
pager.setAdapter(adapter);
TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout);
tabLayout.setupWithViewPager(pager, true);
レイアウトを作成したら、ドットを準備する必要があります。そのため、selected_dot.xml
、default_dot.xml
およびtab_selector.xml
の3つのファイルを作成します。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape
Android:innerRadius="0dp"
Android:shape="ring"
Android:thickness="8dp"
Android:useLevel="false">
<solid Android:color="@color/colorAccent"/>
</shape>
</item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape
Android:innerRadius="0dp"
Android:shape="ring"
Android:thickness="8dp"
Android:useLevel="false">
<solid Android:color="@Android:color/darker_gray"/>
</shape>
</item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/selected_dot"
Android:state_selected="true"/>
<item Android:drawable="@drawable/default_dot"/>
</selector>
これで、XMLレイアウトのTabLayout
に3行のコードを追加するだけで済みます。
app:tabBackground="@drawable/tab_selector"
app:tabGravity="center"
app:tabIndicatorHeight="0dp"
まずレイアウトを作成します。その中であなたのView Pager上に表示されるDotのためのLinerLayoutを一つ与えます
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<Android.support.v4.view.ViewPager
Android:id="@+id/view_pager"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
<LinearLayout
Android:id="@+id/pager_dots"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_marginBottom="10dp"
Android:background="@Android:color/transparent"
Android:gravity="center_horizontal"
Android:orientation="horizontal">
</LinearLayout>
</RelativeLayout>
その後2つのドロアブルを作成します
1。選択されていない描画可能
<?xml version="1.0" encoding="utf-8"?>
<shape Android:shape="oval" xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid Android:color="@Android:color/transparent"/>
<size Android:width="12dp" Android:height="12dp"/>
<stroke Android:width="1dp" Android:color="#ffffff"/>
</shape>
2。選択された描画可能
<?xml version="1.0" encoding="utf-8"?>
<shape Android:shape="oval" xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid Android:color="@Android:color/transparent"/>
<size Android:width="12dp" Android:height="12dp"/>
<stroke Android:width="1dp" Android:color="#000000"/>
</shape>
その後設定したアダプタ
private LinearLayout llPagerDots;
private ViewPager viewPager;
private ArrayList<String> eventImagesUrl;
private HomeViewPagerAdapter homeViewPagerAdapter;
private ImageView[] ivArrayDotsPager;
public void setUpViewPager() {
viewPager = (ViewPager) findViewById(R.id.view_pager);
llPagerDots = (LinearLayout) findViewById(R.id.pager_dots);
homeViewPagerAdapter = new HomeViewPagerAdapter(mContext, eventImagesUrl);
viewPager.setAdapter(homeViewPagerAdapter);
setupPagerIndidcatorDots();
ivArrayDotsPager[0].setImageResource(R.drawable.page_indicator_selected);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
for (int i = 0; i < ivArrayDotsPager.length; i++) {
ivArrayDotsPager[i].setImageResource(R.drawable.page_indicator_unselected);
}
ivArrayDotsPager[position].setImageResource(R.drawable.page_indicator_selected);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
メソッドsetupPagerIndidcatorDots()を作成します。
private void setupPagerIndidcatorDots() {
ivArrayDotsPager = new ImageView[eventImagesUrl.size()];
for (int i = 0; i < ivArrayDotsPager.length; i++) {
ivArrayDotsPager[i] = new ImageView(getActivity());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(5, 0, 5, 0);
ivArrayDotsPager[i].setLayoutParams(params);
ivArrayDotsPager[i].setImageResource(R.drawable.page_indicator_unselected);
//ivArrayDotsPager[i].setAlpha(0.4f);
ivArrayDotsPager[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
view.setAlpha(1);
}
});
llPagerDots.addView(ivArrayDotsPager[i]);
llPagerDots.bringToFront();
}
あなたの要求を処理するために私のライブラリをチェックアウトすることができます: https://github.com/tommybuonomo/dotsindicator
XMLレイアウトに
<com.tbuonomo.viewpagerdotsindicator.DotsIndicator
Android:id="@+id/dots_indicator"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
app:dotsColor="@color/colorPrimary"
app:dotsSize="16dp"
app:dotsWidthFactor="3"
/>
あなたのJavaコードで
dotsIndicator = (DotsIndicator) findViewById(R.id.dots_indicator);
viewPager = (ViewPager) findViewById(R.id.view_pager);
adapter = new ViewPagerAdapter();
viewPager.setAdapter(adapter);
dotsIndicator.setViewPager(viewPager);
<Android.support.v4.view.ViewPager
Android:id="@+id/vpImage"
Android:layout_width="match_parent"
Android:layout_height="@dimen/_120sdp" />
<Android.support.design.widget.TabLayout
Android:id="@+id/tlImage"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:tabBackground="@drawable/selector_product_image"
app:tabGravity="center"
app:tabIndicatorHeight="0dp"
app:tabMaxWidth="12dp"
app:tabRippleColor="@null" />
ImageAdapter imageAdapter = new ImageAdapter(context, arrayList);
vpImage.setOffscreenPageLimit(1);
vpImage.setAdapter(imageAdapter);
tlImage.setupWithViewPager(vpImage);
selector_product_image.xml
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/image_selected" Android:state_selected="true" />
<item Android:drawable="@drawable/image_unselected" />
</selector>
image_selected.xml
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape
Android:innerRadius="0dp"
Android:shape="ring"
Android:thickness="4dp"
Android:useLevel="false">
<solid Android:color="@color/colorAccent" />
</shape>
</item>
</layer-list>
image_unselected.xml
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape
Android:innerRadius="0dp"
Android:shape="ring"
Android:thickness="4dp"
Android:useLevel="false">
<solid Android:color="@color/colorPrimary" />
</shape>
</item>
</layer-list>
ImageAdapter.Java
class ImageAdapter extends PagerAdapter {
private Context context;
private ArrayList<ImageModel> arrayList;
private LayoutInflater layoutInflater;
public ImageAdapter(Context context, ArrayList<ImageModel> arrayList) {
this.context = context;
this.arrayList = arrayList;
this.layoutInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return arrayList.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view == ((View) o);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = layoutInflater.inflate(R.layout.row_slider_image, container, false);
AppCompatImageView ivProductImage = view.findViewById(R.id.ivProductImage);
if (!TextUtils.isEmpty(arrayList.get(position).getImage())) {
Glide.with(context)
.load(arrayList.get(position).getImage())
.apply(new RequestOptions().placeholder(R.drawable.no_image).error(R.drawable.no_image))
.into(ivProductImage);
}
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
row_slider_image.xml
<Android.support.v7.widget.LinearLayoutCompat xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<Android.support.v7.widget.AppCompatImageView
Android:id="@+id/ivProductImage"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:src="@drawable/no_image" />
</Android.support.v7.widget.LinearLayoutCompat>
あなたのxml
<RelativeLayout
Android:id="@+id/rl_speed"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_above="@+id/ll_dashboard_buttons"
Android:layout_below="@+id/ib_menu">
<com.smart.gps.speedometer.app.utils.SmartViewPager
Android:id="@+id/view_pager"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</com.smart.gps.speedometer.app.utils.SmartViewPager>
<Android.support.design.widget.TabLayout
Android:id="@+id/sliding_tabs"
Android:layout_alignParentBottom="true"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:tabBackground="@drawable/tab_selector"
app:tabIndicatorHeight="0dp"
app:tabGravity="center"
/>
ドロウアブルを作成します。ドロアブルを右クリック - >新規 - >ドロアブルファイルリソース名そのファイル
tab_selector.xml
<item Android:drawable="@drawable/selected_tab"
Android:state_selected="true"/>
<item Android:drawable="@drawable/unselected_tab"/>
今2つのxmlファイルがあります。尊敬される名前でさらに2つのxmlファイルを作成します。これらはセレクターインジケーターと未選択のインジケーターです
selected_tab.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape
Android:innerRadius="0dp"
Android:shape="ring"
Android:thickness="4dp"
Android:useLevel="false">
<solid Android:color="@color/highspeed"/>
</shape>
</item>
</layer-list>
unselected_tab.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item>
<shape
Android:innerRadius="0dp"
Android:shape="ring"
Android:thickness="2dp"
Android:useLevel="false">
<solid Android:color="@Android:color/darker_gray"/>
</shape>
</item>
</layer-list>
ViewFlipperとviewFlipper_linear_dot_lay(Linearlayout)を同じベースラインに配置し、以下のいずれかに従ってください。
viewFlipper_linear_dot_lay= (LinearLayout) findViewById(R.id.dots_lay);
setupDotsOnViewPager(images_viewFlipper);
for (int i = 0; i < images_viewFlipper.size(); i++) {
//Add Images to ViewFlipper
}
private void setupDotsOnViewPager(ArrayList images_viewFlipper) {
images_linear = new ImageView[images_viewFlipper.size()];
for (int i = 0; i < images_linear.length; i++) {
images_linear[i] = new ImageView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(5, 0, 5, 0);
params.gravity = Gravity.BOTTOM | Gravity.CENTER;
images_linear[i].setLayoutParams(params);
images_linear[i].setImageResource(R.drawable.unselected);
viewFlipper_linear_dot_lay.addView(images_linear[i]);
viewFlipper_linear_dot_lay.bringToFront();
}
}
そしてOnRightとOnLeftの取得は以下のコードを配置します
for (int i = 0; i < images_linear.length; i++) {
images_linear[i].setImageResource(R.drawable.unselected);
}
images_linear[viewFlipper.getDisplayedChild()].setImageResource(R.drawable.selected);