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…

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…

实例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)

实例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))

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

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

实例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)

《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;…

实例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…

2021届定远三中高考成绩查询,定远各中学高考喜报!

原标题&#xff1a;定远各中学高考喜报&#xff01;关注定远2019年高考实现多项新突破本科达线人数较上年增加340人(点击看大图)砥砺前行新时代&#xff0c;定远教育写华章。6月23日&#xff0c;全县人民高度关注的2019年高考成绩揭晓。我县教体系统广大师生不负众望&#xff0…

实例30:python

#一个5位数&#xff0c;判断它是不是回文数。即12321是回文数&#xff0c; #个位与万位相同&#xff0c;十位与千位相同。 x int(input(‘输入一个五位数&#xff1a;’)) a int(x / 10000) b int(x % 10000 / 1000) c int(x % 1000 / 100) d int(x % 100 / 10) e int(x …

实例31:python

#题目&#xff1a;请输入星期几的第一个字母来判断一下是星期几 #!/usr/bin/python -- coding: UTF-8 -- letter input(“please input:”) #while letter ! ‘Y’: if letter ‘S’: print (‘please input second letter:’) letter input(“please input:”) if lette…

实例32:python

#按相反的顺序输出列表的值。 #!/usr/bin/python -- coding: UTF-8 -- a [‘one’, ‘two’, ‘three’] for i in a[::-1]: print (i)

整样运用计算机考试,2017年9月计算机二级考试《MS Office高级应用》上机操作题(2)...

字处理题12012级企业管理专业的林楚楠同学选修了“供应链管理”课程&#xff0c;并撰写了题目为“供应链中的库存管理研究”的课程论文。论文的排版和参考文献还需要进一步修改&#xff0c;根据以下要求&#xff0c;帮助林楚楠对论文进行完善。(1)在考生文件夹下&#xff0c;将…

Django缓存和内置信号

缓存 简单概括就是将对数据库操作查询所得到的数据放入另外一台机器上(缓存)中&#xff0c;当用户再次请求时&#xff0c;直接去缓存中拿&#xff0c;避免对数据库的频繁操作&#xff0c;加快数据的显示时间&#xff0c;需要知道的是&#xff0c;缓存里面的数据一般都设置有超时…

实例33:python

#题目&#xff1a;按逗号分隔列表。 #!/usr/bin/python -- coding: UTF-8 -- L [1,2,3,4,5] s1 ‘,’.join(str(n) for n in L) print (s1)

你的第一个Django程序

本文使用Pycharm、Django 2.0.9、Python 3.6环境&#xff0c;本文大纲 建立Django项目建立页面什么是URLconf和ROOT_URLCONFDjango怎么处理URL请求关于URL尾部的“/” 反斜线1. 建立一个Django项目 Application name如果填写会自动帮你建立一个APP&#xff0c;而且APP是必须的&…

分割法和填补法_“聚合”法与“分割”法

一门新的思维与实践的科学“聚合”法是宗脉学中“宗脉”关系的根本原则&#xff0c;这是一门新的思维与实践的科学&#xff0c;它的研究角度和方法都不同于任何以往唯物主义与唯心主义学派。“宗”即是整体&#xff0c;本质&#xff0c;聚和&#xff0c;“脉”是本质的分支与脉…

[USACO 2017 Feb Gold] Tutorial

Link: 传送门 A: 分层图最短路&#xff08;其实就是最短路转移时多记录一维的数据 #include <bits/stdc.h>using namespace std; #define X first #define Y second typedef double db; typedef long long ll; typedef pair<int,int> P; const int MAXN105; int n,…