Android程序员用控件玩彩票,告诉网友什么叫真正的随机
2019-10-12 10:20
821 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Aerfa789/article/details/102515519
为了买彩票,我写了这个控件
0.
最近偶尔会买个双色球,一周买个6块钱的,也不多,就是凑个热闹,为生活添加个小情趣
因为不会选号,每次都是机选,作为一个阴谋论者,我觉得机选可能不够"随机",为此我决定自己写个程序为我选号,学过Java会Android的我模仿老虎机写了一个控件。先上图
1.
先设计一下
1.1支持从数字和数组获取数据
1.2绘制两个数字,当前数字和下一个数字
1.3设置便宜量,并实现加速
1.4开始和停止,停止时添加回调
1.5支持设置文字大小与颜色
2.
废话少说,上代码
package com.skateboard.numberrunningview import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.support.v4.view.ViewCompat import android.util.AttributeSet import android.view.View class NumberRunningView(context: Context, attributes: AttributeSet?) : View(context, attributes) { private var numberColor = Color.WHITE private var numberSize = 15.0f //开始时的数字或者数组下标 var min = 0 //最大的数字或者数组下标 var max = 0 //当前要绘制数字或者数组下标 private var now = min //每次刷新移动的距离 private var offset = 0 private var paint = Paint(Paint.ANTI_ALIAS_FLAG) private var isStart = false var maxSpeed = 10f //当前移动速度 private var curSpeed = 0f //加速度增量 private var speedOffset = 0.1f var dataList: List<Int>? = null set(value) { field = value min = 0 max = (value?.size ?: 1) - 1 now = min offset = 0 } var onNumberSelectedListener: OnNumberSelectedListenern? = null init { if (attributes != null) { parseAttrs(attributes) } initPaint() } constructor(context: Context) : this(context, null) private fun parseAttrs(attributes: AttributeSet) { val typedArray = context.obtainStyledAttributes(attributes, R.styleable.NumberRunningView) min = typedArray.getInt(R.styleable.NumberRunningView_min, min) max = typedArray.getInt(R.styleable.NumberRunningView_max, max) maxSpeed = typedArray.getFloat(R.styleable.NumberRunningView_maxSpeed, maxSpeed) numberColor = typedArray.getColor(R.styleable.NumberRunningView_numberColor, numberColor) numberSize = typedArray.getDimension(R.styleable.NumberRunningView_numberSize, numberSize) speedOffset = typedArray.getFloat(R.styleable.NumberRunningView_speedOffset, 0.1f) typedArray.recycle() now = min } private fun initPaint() { paint.textSize = numberSize paint.color = numberColor } override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) canvas?.let { drawNow(it) drawNext(it) calCurSpeed() calOffset() } } private fun calCurSpeed() { curSpeed += speedOffset if (curSpeed > maxSpeed) curSpeed = maxSpeed } private fun drawNow(canvas: Canvas) { val curDataList = dataList var nowNum = "0" nowNum = if (curDataList != null) { curDataList[now].toString() } else { now.toString() } val numWidth = paint.measureText(nowNum) canvas.drawText(nowNum, width / 2 - numWidth / 2, height / 2 - offset + paint.textSize / 2, paint) } private fun drawNext(canvas: Canvas) { val curDataList = dataList var nextNum = "" if (curDataList == null) { nextNum = if (now + 1 > max) { min.toString() } else { (now + 1).toString() } } else { nextNum = if (now + 1 > max) { curDataList[min].toString() } else { (curDataList[now + 1]).toString() } } val numWidth = paint.measureText(nextNum) canvas.drawText(nextNum, width / 2 - numWidth / 2, 1.5f * height - offset + paint.textSize / 2, paint) 3ff7 } private fun calOffset() { if (isStart) { if (offset == height) { offset = 0 if (now + 1 > max) { now = min } else { now += 1 } } else if (offset + curSpeed > height) { offset = height } else { offset = (offset + curSpeed).toInt() } postInvalidate() } else { if (offset != 0 && offset != height) { offset = if (offset + curSpeed > height) { height } else { (offset + curSpeed).toInt() } postInvalidate() } else { if (offset == 0) { val curDataList = dataList if (curDataList != null) { onNumberSelectedListener?.onNumberSelected(curDataList[now]) } else { onNumberSelectedListener?.onNumberSelected(now) } } else { val curDataList = dataList if (curDataList != null) { onNumberSelectedListener?.onNumberSelected(if (now == max) curDataList[min] else curDataList[now + 1]) } else { onNumberSelectedListener?.onNumberSelected(if (now == max) min else now + 1) } } } } } fun start() { if (isStart) { return } curSpeed = 0f isStart = true if (ViewCompat.isAttachedToWindow(this)) { postInvalidate() } } fun stop() { isStart = false } interface OnNumberSelectedListenern { fun onNumberSelected(num: Int) } }
- 代码比较简单,没什么难度,先看onDraw方法
private fun drawNow(canvas: Canvas) { val curDataList = dataList var nowNum = "0" nowNum = if (curDataList != null) { curDataList[now].toString() } else { now.toString() } val numWidth = paint.measureText(nowNum) canvas.drawText(nowNum, width / 2 - numWidth / 2, height / 2 - offset + paint.textSize / 2, paint) }
- 首先根据数据源的不同获取的数据,然后计算文字绘制的位置,然后绘制 drawNext大同小异,无非就是一个下一个数字的判断问题 calOffset方法
private fun calOffset() { if (isStart) { if (offset == height) { offset = 0 if (now + 1 > max) { now = min } else { now += 1 } } else if (offset + curSpeed > height) { offset = height } else { offset = (offset + curSpeed).toInt() } postInvalidate() } else { if (offset != 0 && offset != height) { offset = if (offset + curSpeed > height) { height } else { (offset + curSpeed).toInt() } postInvalidate() } else { if (offset == 0) { val curDataList = dataList if (curDataList != null) { onNumberSelectedListener?.onNumberSelected(curDataList[now]) } else { onNumberSelectedListener?.onNumberSelected(now) } } else { val curDataList = dataList if (curDataList != null) { onNumberSelectedListener?.onNumberSelected(if (now == max) curDataList[min] else curDataList[now + 1]) } else { onNumberSelectedListener?.onNumberSelected(if (now == max) min else now + 1) } } } } }
- 如果处于运行状态,先判断控件当前偏移量,如果等于控件高度,那么就重置为0,然后将now置为下一个数,否则就加上速度重新计算偏移量。
- 如果不处于运行状态,那么判断当前的偏移量,如果既不等于0也不等于控件高度,说明处于一个中间状态,那么就让它移到下一个位置,并调用回调函数。其他的也没什么关键了,各位有需要的看代码就好了
3.
控件代码就全部告诉大家了,感受一把随机的乐趣,至于彩票,这是薛定谔的彩票。也不要太沉迷,要不然,最后就是西湖的水,我的泪。
喜欢这篇文章的朋友可以关注我,会给大家带来最全Android面试内容知识和最新Android进阶知识。
相关文章推荐
- android不用xml文件,动态写Animation,注:Animation并不会真正移动控件,需要调用onAnimationEnd
- Android开发-UI控件:Fragment 真正的完全解析(上)
- Android随机布局控件RandomLayout
- 网友做的android无级树(多级树)控件工程(含源代码)
- Android中自定义控件之飞入飞出布局及随机布局实现方式
- android不用xml文件,动态写Animation,注:Animation并不会真正移动控件,需要调用onAnimationEnd
- android 拖动圆形控件 滑动到屏幕边缘随机改变颜色
- 什么叫真正的程序员
- 告诉大家。Android 打造任意层级树形控件 考验你的数据结构和设计
- Android ----可伸缩的控件
- Android 中动态设置控件高宽
- Android控件Gallery3D效果
- 一步一步学android控件(之十) —— Gallery
- android关于控件中setTag(key,Object)的设置的相关问题
- Android DatePicker控件获取时间月份少1
- Android状态栏微技巧,带你真正理解沉浸式模式
- android webview图片文件上传——上传控件点击无效的解决办法
- Android开发实现Switch控件修改样式功能示例【附源码下载】
- 22岁二本渣院的程序员腾讯+阿里offer(Android面经)
- Android自定义View,高仿QQ音乐歌词滚动控件!