Android_指引点View
来源:互联网 发布:淘宝卖家取消订单投诉 编辑:程序博客网 时间:2024/05/01 22:42
项目中多多少少都会用到一个view,类似于indicatior,viewpager滑动到第几个,第几个点选中,本身这个东西实现由很多方式,并不难,可以在xml 写,但是代码量有点大,还是做成一个view拿来用就行,今天就带来这个简单的view
如下图:
我们只要像textview一样使用就能达到下面几个点点的效果,
首先我们分析下我们支持的扩展属性
"> <attr name="point_view_selector_background" format="reference" /> <attr name="point_view_point_size" format="dimension" /> <attr name="point_view_point_margin" format="dimension" /> </declare-styleable>
这里我提供了三个属性,一个是点点的选择状态,另外是点点的大小,和点点的间距,
ok,自定义属性,完毕,我们开始写我们的view
这个view其实继承viewgroup 比继承view好实现,所以我继承了Lxxxayout,
这样我们可以不用管方向 只要管好里面子view的间距即可
如下;
我们在构造函数中获取自定义属性
public ATDotPointView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setOrientation(HORIZONTAL); setGravity(Gravity.CENTER); dotList = new ArrayList<>(); DisplayMetrics metrics = getResources().getDisplayMetrics(); TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ATDotPointView, defStyleAttr, 0); int indexCount = typedArray.getIndexCount(); for (int i = 0; i < indexCount; i++) { int attr = typedArray.getIndex(i); switch (attr) { case R.styleable.ATDotPointView_point_view_selector_background: mDotPintBackgroundRes = typedArray.getResourceId(attr, 0); break; case R.styleable.ATDotPointView_point_view_point_size: pointSize = typedArray.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, POINT_DE_SIZE, metrics)); break; case R.styleable.ATDotPointView_point_view_point_margin: pointMargin = typedArray.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, POINT_DE_MARGIN, metrics)); break; } } typedArray.recycle(); pointSize = pointSize == 0 ? (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, POINT_DE_SIZE, metrics) : pointSize; pointMargin = pointMargin == 0 ? (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, POINT_DE_MARGIN, metrics) : pointMargin; }
获取属性完毕后,我们提供生成一个小球的方法
/** * generate dot point */ private View generateDotPoint() { View view = new View(getContext()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(pointSize, pointSize); params.rightMargin = pointMargin; view.setLayoutParams(params); view.setBackgroundResource(mDotPintBackgroundRes); return view; }
直接返回一个view即可,
提供添加小球的方法
/** * add point into point view * * @param dotPointCount point count; */ public void addPoint2View(int dotPointCount) { removeAllViews(); dotList.clear(); for (int i = 0; i < dotPointCount; i++) { View dotPoint = generateDotPoint(); dotList.add(dotPoint); addView(dotPoint); } // default first point select setDotPointSelecedByInDex(0); }
提供选中当前小球的方法
/** * set point select * * @param index select index */ public void setDotPointSelecedByInDex(int index) { resetPointViewState(); dotList.get(index).setSelected(true); }
ok 到此我们的view定义完毕,这样 无论哪个界面用到指点的时候,只需要引入你的view即可,很简单下面把完整的view代码放下面.
public class ATDotPointView extends LinearLayout { private static final int POINT_DE_SIZE = 9; private static final float POINT_DE_MARGIN = 12; private List<View> dotList; private int mDotPintBackgroundRes; private int pointSize; private int pointMargin; public ATDotPointView(Context context) { this(context, null); } public ATDotPointView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ATDotPointView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setOrientation(HORIZONTAL); setGravity(Gravity.CENTER); dotList = new ArrayList<>(); DisplayMetrics metrics = getResources().getDisplayMetrics(); TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ATDotPointView, defStyleAttr, 0); int indexCount = typedArray.getIndexCount(); for (int i = 0; i < indexCount; i++) { int attr = typedArray.getIndex(i); switch (attr) { case R.styleable.ATDotPointView_point_view_selector_background: mDotPintBackgroundRes = typedArray.getResourceId(attr, 0); break; case R.styleable.ATDotPointView_point_view_point_size: pointSize = typedArray.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, POINT_DE_SIZE, metrics)); break; case R.styleable.ATDotPointView_point_view_point_margin: pointMargin = typedArray.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, POINT_DE_MARGIN, metrics)); break; } } typedArray.recycle(); pointSize = pointSize == 0 ? (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, POINT_DE_SIZE, metrics) : pointSize; pointMargin = pointMargin == 0 ? (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, POINT_DE_MARGIN, metrics) : pointMargin; } /** * add point into point view * * @param dotPointCount point count; */ public void addPoint2View(int dotPointCount) { removeAllViews(); dotList.clear(); for (int i = 0; i < dotPointCount; i++) { View dotPoint = generateDotPoint(); dotList.add(dotPoint); addView(dotPoint); } // default first point select setDotPointSelecedByInDex(0); } /** * generate dot point */ private View generateDotPoint() { View view = new View(getContext()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(pointSize, pointSize); params.rightMargin = pointMargin; view.setLayoutParams(params); view.setBackgroundResource(mDotPintBackgroundRes); return view; } /** * set all point selected false */ private void resetPointViewState() { for (View pointView : dotList) { pointView.setSelected(false); } } /** * set point select * * @param index select index */ public void setDotPointSelecedByInDex(int index) { resetPointViewState(); dotList.get(index).setSelected(true); }}
0 0
- Android_指引点View
- Android_自定义View
- android_自定义折叠View
- Android_自定义View拖拽重绘
- Android_自定义删除View
- Android_自定义倒计时View
- Android_自定义签到View
- Android_自定义波纹view
- Android_自定义View、Fragment
- Android_自定义View测量模式
- Android_自定义view动画按钮
- Android_自定义View之跳动的loading
- Android_自定义view设置控件位置
- Android_自定义描述进度的View
- 计算机视觉&点云处理学术指引
- Android_自定义View-和view的监听事件
- 一个超级方面的用户指引view—App实现用户指引就是如此简单
- android_系统三大核心:AmS/WmS/View
- Centos 7 Redis 3.2.0
- C# 报表设计器 (winform 设计端)开发与实现生成网页的HTML报表 开放源码及调试
- Wet Shark and Odd and Even
- Ajax基础教程
- odoo 销售订单出库单操作代码简单剖析
- Android_指引点View
- 刀片服务器部署VMWare vSphere遇到的问题总结
- 几款好用的比较工具
- 背景建模--内核密度估计法
- linux内核研究(一)
- qt序列化 (二)
- java中正则表达式的使用(2)——列出百度搜索的前十项
- UIImageView的contentMode
- Wet Shark and Odd and Even