android 滚动尺画到控件中间,android 刻度尺控件实现

主要实现刻度尺的效果,能够快速滑动刻度,设置刻度间距,刻度值,滑动回调。简单易用

效果图

0818b9ca8b590ca3270a3433284dd417.png

textureView控件的选择

总结来说:

1.view的绘制在主线程里面,频繁绘制会导致主线程阻塞

2.我们知道一个surfaceview是异步绘制的,不阻塞主线程,但是它不支持平移、缩放、旋转,且很难放在srollview等控件里面

TextureView.SurfaceTextureListener

abstract void

Invoked when a

abstract boolean

Invoked when the specified

is about to be destroyed.

//textureview销毁时,可以在这个地方释放一些资源,比如camera

abstract void

Invoked when the

abstract void

@Override

public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {

mBorderRectF.set(mBorderPaint.getStrokeWidth(), mBorderPaint.getStrokeWidth(),

width - mBorderPaint.getStrokeWidth(), height - mBorderPaint.getStrokeWidth()); //设置一块矩形区域,

mWidth = mBorderRectF.width();

dis = (int)(mWidth / allBlockNum); //每个刻度间距,allBlockNum是小刻度的个数

refreshCanvas();

}

//刷新视图

private void refreshCanvas() {

if (mBorderRectF.isEmpty()) {

return;

}

Canvas canvas = lockCanvas();

if(canvas != null) {

canvas.drawColor(Color.WHITE);

drawBorder(canvas);

drawScaleMark(canvas);

drawMarkPoint(canvas);

}

unlockCanvasAndPost(canvas);

}

画出刻度线:由中间向两边画

//画出所有刻度:从中间向两边画

private void drawScaleMark(Canvas canvas) {

int count = 0;

final int centerX = (int)mBorderRectF.centerX();

if(mCenterNum > maxNum)

mCenterNum = maxNum;

if (mCenterNum < minNum)

mCenterNum = minNum;

if(numberListener != null)

numberListener.onChanged(mCenterNum);

while(true){

int left = centerX - dis * count;

int leftNum = mCenterNum - count * scaleNum;

int right = centerX + dis * count;

int rightNum = mCenterNum + count * scaleNum;

String leftText = String.valueOf(leftNum);

String rightText = String.valueOf(rightNum);

//间隔5刻度画文字信息

if(leftNum % (5*scaleNum) == 0) {

canvas.drawLine(left, canvas.getHeight() / 2, left, canvas.getHeight() - 1, mScaleMarkPaint);

mScaleMarkPaint.getTextBounds(leftText, 0, leftText.length(), mTextRect);

canvas.drawText(leftText, left - mTextRect.centerX(), canvas.getHeight() / 2, mScaleMarkPaint);

}

else

canvas.drawLine(left, canvas.getHeight() * 2 / 3, left, canvas.getHeight() - 1, mScaleMarkPaint);

if(rightNum % (5*scaleNum) == 0) {

canvas.drawLine(right, canvas.getHeight() / 2, right, canvas.getHeight() - 1, mScaleMarkPaint);

mScaleMarkPaint.getTextBounds(rightText, 0, rightText.length(), mTextRect);

canvas.drawText(rightText, right - mTextRect.centerX(), canvas.getHeight() / 2, mScaleMarkPaint);

}

else

canvas.drawLine(right, canvas.getHeight() * 2 / 3, right, canvas.getHeight() - 1, mScaleMarkPaint);

count++;

if(left < 0)

break;

}

}

手势判断

我把手势判断的逻辑代码写在ScaleScroller类中,onTouchEvent用来判断按下,移动和抬起三个手势。GestureDetector.SimpleOnGestureListener中的onFling来处理快速滑动

OnFling在手指快速滑动控件时触发,onfling有四个参数

(注意:onFling只能触发一次,但是快速滑动的效果是要在一定时间内做滚动处理,所以需要通过Scroller类+Handler的方式来帮助实现)

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

final int minX = -0x7fffffff;

final int maxX = 0x7fffffff;

lastX = 0;

scroller.fling(0, 0, (int)-velocityX, 0, minX, maxX, 0, 0); //滚动的距离有速度决定

handler.sendEmptyMessage(ON_FLING);

return true;

}

e1

The first down motion event that started the fling.       //按下时候的event

e2

The move motion event that triggered the current onFling.  //触发快速滑动时的event

velocityX

The velocity of this fling measured in pixels per second along the x axis.

velocityY

The velocity of this fling measured in pixels per second along the y axis.

private Handler handler = new Handler(){

@Override

public void handleMessage(Message msg) {

boolean isFinished = scroller.computeScrollOffset(); //判断滚动是否结束

int curX = scroller.getCurrX();

int delta = lastX - curX;

if(listener != null){

listener.onScroll(delta);

}

lastX = curX;

if(isFinished)

handler.sendEmptyMessage(ON_FLING);

else

listener.onFinished();

}

};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实例24:python

#题目&#xff1a;有一分数序列&#xff1a;2/1&#xff0c;3/2&#xff0c;5/3&#xff0c;8/5&#xff0c;13/8&#xff0c;21/13…求出这个数列的前20项之和。 #!/usr/bin/python -- coding: UTF-8 -- a 2.0 b 1.0 s 0 for n in range(1,21): s a / b t a a a b b…

适合新手入门的8个python项目_推荐:一个适合于Python新手的入门练手项目

随着人工智能的兴起&#xff0c;国内掀起了一股Python学习热潮&#xff0c;入门级编程语言&#xff0c;大多选择Python&#xff0c;有经验的程序员&#xff0c;也开始学习Python&#xff0c;正所谓是人生苦短&#xff0c;我用Python有个Python入门练手项目&#xff0c;一直没有…

Luogu 4514 上帝造题的七分钟

二维差分树状数组。 定义差分数组$d_{i, j} a_{i, j} a_{i - 1, j - 1} - a_{i, j - 1} - a_{i - 1, j}$&#xff0c;有$a_{i, j} \sum_{x 1}^{i}\sum_{y 1}^{j}d_{i, j}$。 我们要求$sum(n, m) \sum_{i 1}^{n}\sum_{j 1}^{m}a_{i, j} $&#xff0c; 代入$a_{i, j}$&am…

jsp空白页面传html代码,echarts在HTML里测试一般,在jsp页面不显示,而且还把整个页面变成空白...

echarts在HTML里测试正常&#xff0c;在jsp页面不显示&#xff0c;而且还把整个页面变成空白echarts在HTML里测试正常&#xff0c;在jsp页面不显示&#xff0c;而且还把整个页面变成空白&#xff0c;请大神帮忙&#xff0c;急&#xff0c;在线等Created by IntelliJ IDEA.User:…

实例25:python

#题目&#xff1a;求12!3!…20!的和。 #!/usr/bin/python -- coding: UTF-8 -- n 0 s 0 t 1 for n in range(1,21): t * n s t print (‘1! 2! 3! … 20! %d’ % s)

mysql日期格式化季度_mysql按年度、季度、月度、周、日统计查询的sql语句

本文介绍一些mysql中用于查询的sql语句&#xff0c;包括按年度、季度、月度、周、日统计查询等&#xff0c;有需要的朋友&#xff0c;可以参考下。一、年度查询查询 本年度的数据SELECT *FROM blog_articleWHERE year( FROM_UNIXTIME( BlogCreateTime ) ) year( curdate( ))二…

html字体变大自动换行,网页css中实现字符超出宽度自动换行和英语字符不断行的解决方法...

需求&#xff1a;为了使英语字符不断开&#xff0c;我在显示内容的style是text-align:justify; text-justify:inter-ideograph。可是这样子在后台添加内容时&#xff0c;如果不是键盘输入的&#xff0c;而是copy到输入框里的话&#xff0c;这样前台显示出来的帖子内容会把表格撑…

Thread类中的join方法

package charpter06; //类实现接口public class Processor implements Runnable { // 重写接口方法 Override public void run() { for (int i 0; i < 100; i) { System.out.println(Thread.currentThread().getName() "*****************" i); } } } --------…

实例26:python

#题目&#xff1a;利用递归方法求5! #!/usr/bin/python -- coding: UTF-8 -- def fact(j):#定义一个函数 sum 0 if j 0: sum 1 else: sum j * fact(j - 1) return sum print (fact(5))

苹果地图副总裁_Amazon A9副总裁Benoit Dupin加入苹果,负责改善苹果地图搜索服务...

继挖角William Stasior 管理Siri之后&#xff0c;苹果最近又出手了&#xff0c;这一次&#xff0c;Amazon A9 搜索技术团队的副总裁 Benoit Dupin 将加入苹果&#xff0c;并负责改善苹果地图搜索服务。Benoit Dupin 2007年加入Amazon&#xff0c;主要负责搜索架构、用户体验等相…

[SimplePlayer] 2. 在屏幕上显示视频图像

我们这里采用SDL&#xff08;本文所用版本为SDL2.0.5&#xff09;来进行图像输出&#xff0c;SDL在进行图像渲染时一般采用的会是direct3D或者opengl&#xff0c;SDL对它们进行了封装&#xff0c;不过我们这里只讨论SDL的使用&#xff0c;并不会去涉及这些底层实现。尽管如此&a…

vb检测html事件,VB代码VB小程序:捕获 WebBrowser 控件的鼠标事件

49. 捕获 WebBrowser 控件的鼠标事件VB 的网页浏览控件 WebBrowser 没有 MouseDown、MouseMove、MouseUp 等鼠标事件&#xff0c;要在程序中捕获这些事件&#xff0c;必须另想办法。本文使用注入 java 脚本的方法来捕获控件的鼠标事件。另一更为有效的方法&#xff0c;可以捕获…

实例27:python

#题目&#xff1a;利用递归函数调用方式&#xff0c;将所输入的5个字符&#xff0c;以相反顺序打印出来。 #函数赋值两个变量 def output(s,l): if l0: return print (s[l-1]) output(s,l-1) s input(‘Input a string:’) l len(s) output(s,l)

python的describe参数_python pandas DataFrame.describe用法及代码示例

生成描述性统计信息。描述性统计数据包括总结数据集分布的集中趋势&#xff0c;离散度和形状的统计数据&#xff0c;但不包括NaN值。分析数值和对象序列&#xff0c;以及DataFrame混合数据类型的列集。输出将根据提供的内容而有所不同。有关更多详细信息&#xff0c;请参阅以下…

《React Native跨平台移动应用开发》PDF电子书分享

链接: https://pan.baidu.com/s/14r6xZPJ0u1mrZejEuV8RrA 密码: pqan 分享《React Native跨平台移动应用开发》PDF电子书&#xff0c;本书为高清PDF电子书&#xff0c;内容截图如下 转载于:https://www.cnblogs.com/meidongdiluo/p/9625607.html

实例28:python

#题目&#xff1a;有5个人坐在一起&#xff0c;问第五个人多少岁&#xff1f;他说比第4个人大2岁。 #问第4个人岁数&#xff0c;他说比第3个人大2岁。问第三个人&#xff0c;又说比第2人大两岁。 #问第2个人&#xff0c;说比第一个人大两岁。最后问第一个人&#xff0c;他说是1…

如何使用vs2017进行html开发,VS2017开发vue单页应用

我正在学vue开发&#xff0c;想用VS开发一个单页应用&#xff0c;按照网上的提示配置好了&#xff0c;但是始终无法运行起来&#xff0c;主要有以下两点&#xff1a;在main.js中使用了import Vue from vue&#xff0c;但是实际运行时提示 import 错误无法安装npm包&#xff0c;…

c++语言取整为什么要加0.5_c++ 取整:四舍五入 向上取整 向下取整

AngularJS 脏检查深入分析写在开头 关于Angular脏检查,之前没有仔细学习,只是旁听道说,Angular 会定时的进行周期性数据检查,将前台和后台数据进行比较,所以非常损耗性能. 这是大错而特错的.我甚至在新浪前端面试的时 ...python安装MySQLdb驱动安装了好几次了,索性几个笔记吧,经…

实例29:python

#题目&#xff1a;给一个不多于5位的正整数&#xff0c;要求&#xff1a;一、求它是几位数&#xff0c;二、逆序打印出各位数字 #!/usr/bin/python -- coding: UTF-8 -- x int(input(“请输入一个数:\n”)) a x / 10000 b x % 10000 / 1000 c x % 1000 / 100 d x % 100…

java中的Sort函数,你值得看

基于C语言中的sort如此这么方便&#xff0c;自然而然&#xff0c;java中也有类似C的sort函数。 1.普通数组&#xff1a;Arrays.sort(数组名&#xff0c;开始位置&#xff0c;结束位置)。 2.类中属性排序&#xff1a; 模板&#xff1a; class A { int n; } class cmp implement …