diff --git a/app/src/main/java/com/ccb/arcselect/ui/ArcSelectActivity.java b/app/src/main/java/com/ccb/arcselect/ui/ArcSelectActivity.java index 873e61806d7b12fca19b87b58d8c87ab594e39fb..65b85ba7e3521c2396ece321bfaac02bb65bb4a5 100644 --- a/app/src/main/java/com/ccb/arcselect/ui/ArcSelectActivity.java +++ b/app/src/main/java/com/ccb/arcselect/ui/ArcSelectActivity.java @@ -19,6 +19,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.ccb.arcselect.R; +import com.ccb.arcselect.utils.CenterItemUtils; import com.ccb.arcselect.utils.TUtils; import com.ccb.arcselect.utils.UiUtils; import com.ccb.arcselect.view.MatrixTranslateLayout; @@ -28,6 +29,7 @@ import java.util.List; /** * 矩阵实现弧形列表 && 滑动后自动选中居中的条目 + * 未使用精确计算居中 */ public class ArcSelectActivity extends AppCompatActivity { @@ -86,6 +88,7 @@ public class ArcSelectActivity extends AppCompatActivity { } private boolean isTouch = false; //用户主动触摸后的标记 + private List centerViewItems = new ArrayList<>(); private void findView() { mAdapter = new MAdapter(); @@ -106,8 +109,18 @@ public class ArcSelectActivity extends AppCompatActivity { int centerPositionDiffer = (la - fi) / 2; int centerChildViewPosition = fi + centerPositionDiffer; - centerChildViewPosition = centerChildViewPosition < childViewHalfCount ? childViewHalfCount : centerChildViewPosition; - centerChildViewPosition = centerChildViewPosition < mAdapter.getItemCount() - childViewHalfCount -1 ? centerChildViewPosition : mAdapter.getItemCount() - childViewHalfCount -1; + centerViewItems.clear(); + //遍历循环,获取到和中线相差最小的条目索引(精准查找最居中的条目) + if (centerChildViewPosition != 0){ + for (int i = centerChildViewPosition -1 ; i < centerChildViewPosition+2; i++) { + View cView = recyclerView.getLayoutManager().findViewByPosition(i); + int viewTop = cView.getTop()+(cView.getHeight()/2); + centerViewItems.add(new CenterItemUtils.CenterViewItem(i ,Math.abs(centerToTopDistance - viewTop))); + } + + CenterItemUtils.CenterViewItem centerViewItem = CenterItemUtils.getMinDifferItem(centerViewItems); + centerChildViewPosition = centerViewItem.position; + } scrollToCenter(centerChildViewPosition); } } diff --git a/app/src/main/java/com/ccb/arcselect/ui/ArcSelectRotateActivity.java b/app/src/main/java/com/ccb/arcselect/ui/ArcSelectRotateActivity.java index be81a82b1e66592305cc45104965cfaa8ac60837..f204ed70a366eef76e19616ff2c9a8dffed446c0 100644 --- a/app/src/main/java/com/ccb/arcselect/ui/ArcSelectRotateActivity.java +++ b/app/src/main/java/com/ccb/arcselect/ui/ArcSelectRotateActivity.java @@ -30,6 +30,7 @@ import java.util.List; /** * 矩阵实现弧形列表 && 滑动后自动选中居中的条目 && 图片跟随旋转 + * 未使用精确计算居中条目 , 可以参考CenterItemUtils类 , 或其它选中居中的界面的实现 */ public class ArcSelectRotateActivity extends AppCompatActivity { diff --git a/app/src/main/java/com/ccb/arcselect/ui/AutoSelectActivity.java b/app/src/main/java/com/ccb/arcselect/ui/AutoSelectActivity.java index 1455240e7ad9713fa6d5da050624cc660c50ee2e..1e89a7f04425f8ff7e9b5128770f889aac2f2f34 100644 --- a/app/src/main/java/com/ccb/arcselect/ui/AutoSelectActivity.java +++ b/app/src/main/java/com/ccb/arcselect/ui/AutoSelectActivity.java @@ -18,6 +18,7 @@ import android.widget.TextView; import android.widget.Toast; import com.ccb.arcselect.R; +import com.ccb.arcselect.utils.CenterItemUtils; import com.ccb.arcselect.utils.TUtils; import com.ccb.arcselect.utils.UiUtils; @@ -90,7 +91,7 @@ private TextView tv; private boolean isTouch = false; - private List centerViewItems = new ArrayList<>(); + private List centerViewItems = new ArrayList<>(); private void findView() { mAdapter = new MAdapter(); recyclerView.setAdapter(mAdapter); @@ -117,10 +118,10 @@ private TextView tv; for (int i = centerChildViewPosition -1 ; i < centerChildViewPosition+2; i++) { View cView = recyclerView.getLayoutManager().findViewByPosition(i); int viewTop = cView.getTop()+(cView.getHeight()/2); - centerViewItems.add(new CenterViewItem(i ,Math.abs(centerToTopDistance - viewTop))); + centerViewItems.add(new CenterItemUtils.CenterViewItem(i ,Math.abs(centerToTopDistance - viewTop))); } - CenterViewItem centerViewItem = getMinDifferItem(centerViewItems); + CenterItemUtils.CenterViewItem centerViewItem = CenterItemUtils.getMinDifferItem(centerViewItems); centerChildViewPosition = centerViewItem.position; } @@ -241,41 +242,4 @@ private TextView tv; } } } - - - /** - * 计算距离中间最近的一个ItemView - * @param itemHeights - * @return - */ - private static CenterViewItem getMinDifferItem(List itemHeights){ - CenterViewItem minItem = itemHeights.get(0); //默认第一个是最小差值 - for (int i = 0; i < itemHeights.size(); i++) { - //遍历获取最小差值 - if (itemHeights.get(i).differ <= minItem.differ){ - minItem = itemHeights.get(i); - } - } - return minItem; - } - -// public static void main(String[] a){ -// -// CenterViewItem i = getMinDifferItem(Arrays.asList( -// new CenterViewItem(2 , 39) -// ,new CenterViewItem(3 , 3) -// ,new CenterViewItem(1 , 9) -// ,new CenterViewItem(4 , 449))); -// System.out.println("position:"+i.position+" height:"+i.differ); -// } - - static class CenterViewItem{ - public CenterViewItem(int position, int differ) { - this.position = position; //当前Item索引 - this.differ = differ; //当前item和居中位置的差值 - } - - public int position; - public int differ; - } } diff --git a/app/src/main/java/com/ccb/arcselect/ui/HorizontalSelectActivity.java b/app/src/main/java/com/ccb/arcselect/ui/HorizontalSelectActivity.java index f7dc5801170deb88b06b819b64fc811deaa1b785..597225373b2364492a0f50bcc1cadc1b157d4a7f 100644 --- a/app/src/main/java/com/ccb/arcselect/ui/HorizontalSelectActivity.java +++ b/app/src/main/java/com/ccb/arcselect/ui/HorizontalSelectActivity.java @@ -19,6 +19,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.ccb.arcselect.R; +import com.ccb.arcselect.utils.CenterItemUtils; import com.ccb.arcselect.utils.TUtils; import com.ccb.arcselect.utils.UiUtils; @@ -91,7 +92,7 @@ private final int CHILDVIEWSIZE = 100; private boolean isTouch = false; - private List centerViewItems = new ArrayList<>(); + private List centerViewItems = new ArrayList<>(); private void findView() { mAdapter = new MAdapter(); recyclerView.setAdapter(mAdapter); @@ -118,10 +119,10 @@ private final int CHILDVIEWSIZE = 100; for (int i = centerChildViewPosition -1 ; i < centerChildViewPosition+2; i++) { View cView = recyclerView.getLayoutManager().findViewByPosition(i); int viewLeft = cView.getLeft()+(cView.getWidth()/2); - centerViewItems.add(new CenterViewItem(i ,Math.abs(centerToLiftDistance - viewLeft))); + centerViewItems.add(new CenterItemUtils.CenterViewItem(i ,Math.abs(centerToLiftDistance - viewLeft))); } - CenterViewItem centerViewItem = getMinDifferItem(centerViewItems); + CenterItemUtils.CenterViewItem centerViewItem = CenterItemUtils.getMinDifferItem(centerViewItems); centerChildViewPosition = centerViewItem.position; } @@ -231,41 +232,4 @@ private final int CHILDVIEWSIZE = 100; } } } - - - /** - * 计算距离中间最近的一个ItemView - * @param itemHeights - * @return - */ - private static CenterViewItem getMinDifferItem(List itemHeights){ - CenterViewItem minItem = itemHeights.get(0); //默认第一个是最小差值 - for (int i = 0; i < itemHeights.size(); i++) { - //遍历获取最小差值 - if (itemHeights.get(i).differ <= minItem.differ){ - minItem = itemHeights.get(i); - } - } - return minItem; - } - -// public static void main(String[] a){ -// -// CenterViewItem i = getMinDifferItem(Arrays.asList( -// new CenterViewItem(2 , 39) -// ,new CenterViewItem(3 , 3) -// ,new CenterViewItem(1 , 9) -// ,new CenterViewItem(4 , 449))); -// System.out.println("position:"+i.position+" height:"+i.differ); -// } - - static class CenterViewItem{ - public CenterViewItem(int position, int differ) { - this.position = position; //当前Item索引 - this.differ = differ; //当前item和居中位置的差值 - } - - public int position; - public int differ; - } } diff --git a/app/src/main/java/com/ccb/arcselect/utils/CenterItemUtils.java b/app/src/main/java/com/ccb/arcselect/utils/CenterItemUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..8a49565f578a5a595e06968d0122830643e7b91e --- /dev/null +++ b/app/src/main/java/com/ccb/arcselect/utils/CenterItemUtils.java @@ -0,0 +1,42 @@ +package com.ccb.arcselect.utils; + +import java.util.List; + +public class CenterItemUtils { + + /** + * 计算距离中间最近的一个ItemView + * @param itemHeights + * @return + */ + public static CenterViewItem getMinDifferItem(List itemHeights){ + CenterViewItem minItem = itemHeights.get(0); //默认第一个是最小差值 + for (int i = 0; i < itemHeights.size(); i++) { + //遍历获取最小差值 + if (itemHeights.get(i).differ <= minItem.differ){ + minItem = itemHeights.get(i); + } + } + return minItem; + } + +// public static void main(String[] a){ +// +// CenterViewItem i = getMinDifferItem(Arrays.asList( +// new CenterViewItem(2 , 39) +// ,new CenterViewItem(3 , 3) +// ,new CenterViewItem(1 , 9) +// ,new CenterViewItem(4 , 449))); +// System.out.println("position:"+i.position+" height:"+i.differ); +// } + + public static class CenterViewItem{ + public CenterViewItem(int position, int differ) { + this.position = position; //当前Item索引 + this.differ = differ; //当前item和居中位置的差值 + } + + public int position; + public int differ; + } +}