wordpress 建站后端,西安企业网站设计机构,企业vi设计书籍,网站建设沧州主要实现刻度尺的效果#xff0c;能够快速滑动刻度#xff0c;设置刻度间距#xff0c;刻度值#xff0c;滑动回调。简单易用效果图textureView控件的选择总结来说:1.view的绘制在主线程里面#xff0c;频繁绘制会导致主线程阻塞2.我们知道一个surfaceview是异步绘制的能够快速滑动刻度设置刻度间距刻度值滑动回调。简单易用效果图textureView控件的选择总结来说:1.view的绘制在主线程里面频繁绘制会导致主线程阻塞2.我们知道一个surfaceview是异步绘制的不阻塞主线程但是它不支持平移、缩放、旋转且很难放在srollview等控件里面TextureView.SurfaceTextureListenerabstract voidInvoked when aabstract booleanInvoked when the specifiedis about to be destroyed.//textureview销毁时可以在这个地方释放一些资源比如cameraabstract voidInvoked when theabstract voidOverridepublic 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);}elsecanvas.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);}elsecanvas.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的方式来帮助实现)Overridepublic 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;}e1The first down motion event that started the fling. //按下时候的evente2The move motion event that triggered the current onFling. //触发快速滑动时的eventvelocityXThe velocity of this fling measured in pixels per second along the x axis.velocityYThe velocity of this fling measured in pixels per second along the y axis.private Handler handler new Handler(){Overridepublic 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);elselistener.onFinished();}};