android 刻度尺控件实现
来源:互联网 发布:淘宝联盟怎么身份认证 编辑:程序博客网 时间:2024/04/28 04:16
主要实现刻度尺的效果,能够快速滑动刻度,设置刻度间距,刻度值,滑动回调。简单易用
效果图
textureView控件的选择
刻度尺要不停的绘制,所以view是不可取的,这篇文章介绍了textureview的用法,受益匪浅
总结来说:
1.view的绘制在主线程里面,频繁绘制会导致主线程阻塞
2.我们知道一个surfaceview是异步绘制的,不阻塞主线程,但是它不支持平移、缩放、旋转,且很难放在srollview等控件里面
TextureView.SurfaceTextureListener
Invoked when a
TextureView
's SurfaceTexture is ready for use. Invoked when the specified
SurfaceTexture
is about to be destroyed. //textureview销毁时,可以在这个地方释放一些资源,比如cameraInvoked when the
SurfaceTexture
's buffers size changed.Invoked when the specified
SurfaceTexture
is updated through updateTexImage()
.@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; }
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(); } };
源码地址
2 0
- android 刻度尺控件实现
- Android中刻度尺实现
- Android滚动刻度尺实现
- android 滚轮刻度尺的实现
- android 滚轮刻度尺的实现
- android 滚轮刻度尺的实现
- android 滚轮刻度尺的实现
- Android自定义控件之刻度尺控件
- Android自定义控件尺子 滚动刻度尺
- Android 刻度尺
- android实现一天24小时刻度尺
- Android自定义控件---刻度尺与时间轴(刻度尺对应时间戳)
- 刻度尺选择控件
- Android实现滑动刻度尺效果,选择身高体重和生日
- Android自定义刻度尺的实现思路以及步骤
- 刻度尺
- Android实现竖着的滑动刻度尺效果,选择身高(竖向的)Android实现滑动刻度尺效果,选择身高体重和生日------浅谈Andorid开发中的MVP模式
- iAngularGaugeX--角形刻度尺控件的使用【图文】
- LeetCode-338.Counting Bits
- JS文件中获取JS后面参数
- iOS Appstore打出的包为啥偏大?怎么样减小iOS包的大小?
- Orxy2 github简介
- 为什么你应该从现在开始写博客
- android 刻度尺控件实现
- BOS项目练习(activiti,历史数据操作,流程变量,任务组,监听器,网关,spring整合)
- Web服务器(1):使用Apache服务器进行搭建
- java 值传递和对象传递
- 内存泄漏的一种方式
- OkHttp全解析
- ASCII Unicode UTF-8互转
- [bzoj2342][SHOI2011]双倍回文
- NSMutableParagraphStyle 实现文本缩进