Android实现横向滑动中间高亮显示
来源:互联网 发布:plc的编程语言主要有 编辑:程序博客网 时间:2024/05/18 12:01
我这里用到的是自定义HorizontalScrollView实现简单的类似Wheelview效果,不多说先看代码.
先看布局:
<vgaw.com.WheelView android:id="@+id/wv" android:layout_width="match_parent" android:layout_height="100dp" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" > <LinearLayout android:id="@+id/ll_camera_aperture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:orientation="horizontal"></LinearLayout></vgaw.com.dialogfragment.WheelView>
自定义WheelView继承HorizontalScrollView.主要逻辑:
public class WheelView extends HorizontalScrollView {
private static final int CHECK_STOP_DELAY = 10;
private int itemCount = 5;
private int showItemCount = 5;
private int itemPadding = 0;
private int width;private int itemWidth;private WheelViewAdapter adapter;private LinearLayout rootView;private int currentposstion;public WheelView(Context context, AttributeSet attrs) { super(context, attrs); setHorizontalScrollBarEnabled(false);}public void setAdapter(WheelViewAdapter adapter) { if (adapter != null) { this.adapter = adapter; rootView = (LinearLayout) adapter.getRootView(); showItemCount = adapter.getShowItemCount(); if (showItemCount % 2 == 0) { throw new RuntimeException("show item count show be odd"); } itemCount = adapter.getItemCount(); lstI = showItemCount / 2; }}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (adapter == null) { return; } width = getWidth(); if (width < itemPadding) { throw new RuntimeException("bad item padding"); } itemWidth = (width - (showItemCount - 1) * itemPadding) / showItemCount; for (int i = 0;i < itemCount;i++) { final View item = adapter.getItemView(i); item.post(new Runnable() { @Override public void run() { item.setLayoutParams(new LinearLayout.LayoutParams(itemWidth, ViewGroup.LayoutParams.MATCH_PARENT)); } }); rootView.addView(item); }}private int lstScrollX;@Overridepublic boolean onTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_UP) { lstScrollX = getScrollX(); checkStop(); } return super.onTouchEvent(ev);}private void checkStop() { getHandler().removeCallbacks(checkStopRunnable); postDelayed(checkStopRunnable, CHECK_STOP_DELAY);}private Runnable checkStopRunnable = new Runnable() { @Override public void run() { int crtScrollX = getScrollX(); if (crtScrollX == lstScrollX) { calStop(); } else { lstScrollX = crtScrollX; checkStop(); } }};private int lstI;private void calStop() { if (adapter != null) { //滑动的距离 int crtScrollX = getScrollX(); //当前滑动的多少个item int i = crtScrollX / (itemWidth + itemPadding) - 1; //判断当前滑动距离是否滑过半个item int rest = crtScrollX % (itemWidth + itemPadding); int i1 = itemWidth + itemPadding; if (rest > (itemWidth + itemPadding) / 2) { i++; Log.e("rest==",rest+"//"+i1+"////"+crtScrollX); smoothScrollBy(itemWidth + itemPadding-rest, 0); } else { smoothScrollBy(-rest, 0); } int now = i + (showItemCount / 2)+1 ; adapter.onItemSelected(currentposstion, now, rootView.getChildAt(currentposstion), rootView.getChildAt(now)); currentposstion = now; }}public void setSelectedPosstion(final int i) { currentposstion = lstI + i; new Handler().postDelayed((new Runnable() { @Override public void run() { scrollTo(itemWidth*i,0); adapter.onItemSelected(i+lstI, i+lstI, rootView.getChildAt(i+lstI), rootView.getChildAt(i+lstI)); } }),270);}}
主要的逻辑,之前设置滚动到一个指定的位置,一直没显示后来,后来才知道 scrollTo() 是直接指定滚动条的位置, 但是由于这个动作不是单纯关于 ScrollView 而已, 还要根据 ScrollView 里面包含的View 的实际信息. 所以这动作必须在页面加载完成以后才能执行. 就设置延迟时间270.
在MainActivity这么用:
public class MainActivity extends AppCompatActivity {private HorizontalScrollView hh;@RequiresApi(api = Build.VERSION_CODES.M)@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final WheelView wv = (WheelView) findViewById(R.id.wv); hh = (HorizontalScrollView) findViewById(R.id.hh); final LinearLayout viewById = (LinearLayout) findViewById(R.id.ll_camera_aperture); hh.post(new Runnable() { @Override public void run() { hh.scrollTo(100,0); } }); wv.setAdapter(new WheelViewAdapter() { @Override public int getItemCount() { return 17; } @Override public int getShowItemCount() { return 5; } @Override public View getItemView(int i) { TextView tv = new TextView(MainActivity.this); tv.setText("hello" + i); tv.setGravity(Gravity.CENTER); tv.setBackgroundColor(Color.BLUE); return tv; } @Override public void onItemSelected(int lst, int now, View itemLst, View itemNow) { itemLst.setBackgroundColor(Color.BLUE); itemNow.setBackgroundColor(Color.RED); } @Override public View getRootView() { return viewById; } }); //设置选中的item wv.setSelectedPosition(4); wv.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { Log.e("rest",scrollX+""); } });}}
这里自定义一个Adapter
public interface WheelViewAdapter<V extends View> {int getItemCount();int getShowItemCount();V getItemView(int i);void onItemSelected(int lst, int now, View itemLst, View itemNow);V getRootView();}
阅读全文
0 0
- Android实现横向滑动中间高亮显示
- Android 实现横向滑动效果
- Android实现横向滑动列表
- Android中实现ListView横向滑动
- Android 自定义横向滑动菜单的实现
- android 单行gridview横向滑动的实现
- Android多行gridview横向滑动的实现
- Android 如何实现RecyclerView横向滑动
- Android实现横向滑动的GridView
- recycleview实现title横向滑动,点击条目居中显示
- Android GridView横向滑动 ,并且可限制Gridview显示行数!
- Android--Listview横向滑动
- android 横向滑动 HorizontalScrollView
- Android Listview横向滑动
- Android RecyclerView横向滑动
- Android 横向滑动选择
- Android 不可横向滑动的ViewPager的实现代码
- Android EditText实现可横向滑动TextView效果
- java常考笔试题3
- together项目进度报告8
- TCP/IP 理解
- 机器学习+周志华+9.4编程实现K均值算法
- 关于二分法中,斐波那契查找算法对于对半查找法优势的理解
- Android实现横向滑动中间高亮显示
- 旋转字符串
- spring中bean,factorybean与beanfactory
- 如鹰之歌
- Git使用
- (OK) Android-x86-7.1.1
- java学习(1).static,volatile,transient,final等关键字
- 由表单提交引伸的对JS设计模式的思考
- Rxjava初级详解