Git Product home page Git Product logo

booheeruler's Introduction

富途正在招聘各类岗位,详见链接

totond's github stats

booheeruler's People

Contributors

totond avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

booheeruler's Issues

一些疑问

locationX是从0开始的,为什么绘制出来却在屏幕中间呀。

or (int i = mMinScale; i <= mMaxScale; i++){
            float locationX = (i - mMinScale) * mInterval;
            if (i % 10 == 0) {
                canvas.drawLine(locationX, 0, locationX, mBigScaleLength, mBigScalePaint);
                canvas.drawText(String.valueOf(i/10), locationX, 4 * mSmallScaleLength , mTextPaint);
            }else {
                canvas.drawLine(locationX, 0, locationX, mSmallScaleLength, mSmallScalePaint);
            }
        }

一些建议

有一些APP需要设置标尺的横向和纵向,另外 公英制 的尺度是不一样的,可以考虑加一下。个人建议,仅供参考。

建议

希望能添加个两边虚化的功能

服了

定义了这么多的属性

drawScale方法

请问 drawScale方法中if (locationX > getScrollX() - mDrawOffset && locationX < (getScrollX() + canvas.getWidth() + mDrawOffset))
判断什么的?

除0

//把滑动偏移量scrollX转化为刻度Scale
private float scrollXtoScale(int scrollX) {
return ((float) (scrollX - mMinPosition) / mLength) * mMaxLength + mParent.getMinScale();
}

这个函数会产生 除0 情况。mLength可能为0

轮廓线没有画出来

应该是InnerRuler 这个类里面mOutLinePaint没有设置setAntiAlias(true),所以轮廓线没有画出来,建议加这个,或者添加一个属性可以设置轮廓线的宽度的,超过setStrokeWidth超过1的应该也能显示出来

InnerRuler中没有回收mVelocityTracker

我在看HorizontalScrollView的时候,看到onTouchEvent中MotionEvent.ACTION_UP,都会回收mVelocityTracker:

case MotionEvent.ACTION_UP:
        //...
        recycleVelocityTracker();
        // ...
    break;

请教一下

你在 HorizontalRuler 的scrollBackToCurrentScale 和 fling 方法中调用了 invalidate()方法,为什么它的子类的ondraw()方法没有调用呢?

关于刻度尺最小单位的问题

请问如果我想自定义最小单位该如何去做?例如我想让每个刻度最小单位为10,滑动一个刻度就是增加10或者减少10。并且考虑到多种应用场景,我想让显示的数字不带小数点,全部显示整数,这个该如何处理?最近项目用到大神的框架,希望能指点一下

关于Scroller.fling的请教

你好。我在模仿薄荷卷尺的时候有一个问题:
调用Scroller.fling滑到最后一段距离有一个明显的减速过程,但是我发现你的和薄荷的都没有这样。
我的滑动处理的代码是下面这样的

  int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:

                if (!mFlingScroller.isFinished()) {
                    mFlingScroller.abortAnimation();
                }
                int index = event.getActionIndex();
                mPointActivtyId = event.getPointerId(index);
                mLastX = event.getX();
                if (mVelocityTracker == null) {
                    mVelocityTracker = VelocityTracker.obtain();
                } else {
                    mVelocityTracker.clear();
                }
                mVelocityTracker.addMovement(event);
                break;
            case MotionEvent.ACTION_MOVE:
                mVelocityTracker.addMovement(event);
                int pointIndex = event.findPointerIndex(mPointActivtyId);
                if (pointIndex == -1) {
                    Log.i(TAG, "onTouchEvent: error index");
                    break;
                }

                float x = event.getX(pointIndex);
                float dx = x - mLastX;
                float scrollDx = -dx;

                scrollBy((int) scrollDx, 0);

                mLastX = x;

                break;
            case MotionEvent.ACTION_UP:
                mVelocityTracker.computeCurrentVelocity(1000, mMaximumFling);
                float xvel = VelocityTrackerCompat.getXVelocity(mVelocityTracker,
                        mPointActivtyId);
                Log.i(TAG, "onTouchEvent: " + xvel);

                if (Math.abs(xvel) > mMinimumFling) {
                    mFlingScroller.fling(
                            getScrollX(), getScrollY(),
                            -(int) xvel, 0,//数据设为计算出的速度的相反值
                            leftMaxScorll, rightMaxScroll,
                            0, 0);
                    invalidate();
                } else {
                    ajustScrollX();
                }


                mPointActivtyId = -1;
                mLastX = -1;


                break;
            case MotionEvent.ACTION_CANCEL:
                mPointActivtyId = -1;
                mLastX = -1;
                mVelocityTracker.recycle();
                break;
        }

光标线

其实可以使用getScrollX() + width 来算出绘制光标或横线的位置。

询问Fling结束时的处理方式

我在读你的代码时,感觉你对Fling结束时的处理方式很巧妙。恕我孤陋寡闻,是你自己想的还是有什么参考依据?
下面这段代码:

@Override
public void computeScroll() {
    if (mOverScroller.computeScrollOffset()) {
        scrollTo(mOverScroller.getCurrX(), mOverScroller.getCurrY());

        // 用这种方式判断Fling结束时刻,我觉得挺巧妙的
        if (!mOverScroller.computeScrollOffset() && mCurrentScale != Math.round(mCurrentScale)){
            //Fling完进行一次检测回滚
            scrollBackToCurrentScale();
        }
        invalidate();
    }
}

mCurrentScale的值可能会引起的一个无限绘制的问题

您好,在浏览了您的代码之后,我发现一个可能存在的问题,如题:

如果说mCurrentScale 无限趋近其近似整数的时候,理论上将会一直循环执行scrollBackToCurrentScale()方法

例如 mCurrentScale = 10.991211……,mCurrentScale!=Math.round(mCurrentScale),这个不等式将永远会成立,我觉得是不是应该再加一个处理精度的方法,防止无限绘制下去。

如果刻度尺在scrollview这种布局里面滑动会很卡

如果刻度尺在被scrollview这样的布局包裹的情况下,滑动会有卡顿的感觉,建议在onTouchEvent里面加上处理,我这里重写处理后感觉非常流畅,建议您可以加上,这里是我的处理方式

public boolean onTouchEvent(MotionEvent event) {
ViewGroup parent = (ViewGroup) getParent();
float currentX = event.getX();
//开始速度检测
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            parent.requestDisallowInterceptTouchEvent(true);
            if (!mOverScroller.isFinished()) {
                mOverScroller.abortAnimation();
            }

            mLastX = currentX;
            break;
        case MotionEvent.ACTION_MOVE:
            float moveX = mLastX - currentX;
            mLastX = currentX;
            scrollBy((int) (moveX), 0);
            break;
        case MotionEvent.ACTION_UP:
            //处理松手后的Fling
            mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
            int velocityX = (int) mVelocityTracker.getXVelocity();
            if (Math.abs(velocityX) > mMinimumVelocity) {
                fling(-velocityX);
            } else {
                scrollBackToCurrentScale();
            }
            //VelocityTracker回收
            if (mVelocityTracker != null) {
                mVelocityTracker.recycle();
                mVelocityTracker = null;
            }
            releaseEdgeEffects();
            parent.requestDisallowInterceptTouchEvent(false);
            break;
        case MotionEvent.ACTION_CANCEL:
            if (!mOverScroller.isFinished()) {
                mOverScroller.abortAnimation();
            }
            //回滚到整点刻度
            scrollBackToCurrentScale();
            //VelocityTracker回收
            if (mVelocityTracker != null) {
                mVelocityTracker.recycle();
                mVelocityTracker = null;
            }
            releaseEdgeEffects();
            parent.requestDisallowInterceptTouchEvent(false);
            break;
    }
    return true;
}

主要就是加上requestDisallowInterceptTouchEvent解决垂直和水平的滑动冲突即可
最后非常感谢作者开源的这个控件,写的非常棒,结构清晰,可读性非常棒,帮了很大的忙,真的非常感谢!!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.