深入解析Android边缘效果类EdgeEffectCompat:全面学习指南

更新:11-03 神话故事 我要投稿 纠错 投诉

大家好,今天来为大家解答深入解析Android边缘效果类EdgeEffectCompat:全面学习指南这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

* 构造一个新对象

*

*Note: 对于不支持的版本,不会有任何影响。

*

* @参数上下文

*/

公共EdgeEffectCompat(上下文上下文){

mEdgeEffect=IMPL.newEdgeEffect(上下文);

}

/**

* 设置此边缘效果的大小(以像素为单位)。

* 设置边框的大小(以像素为单位)

*

* @param width 效果宽度(以像素为单位)

* @param height 效果高度(以像素为单位)

*/

公共无效setSize(int宽度,int高度){

IMPL.setSize(mEdgeEffect, 宽度, 高度);

}

/**

* 报告此EdgeEffectCompat 的动画是否完成。如果此方法返回false

* 调用{@link #draw(Canvas)} 后,主机小部件应安排另一个

* 绘制通道以继续动画。

*

* 边缘显示动画是否结束

*

* @return true 如果动画完成,则false 如果绘制应在下一帧继续。

*

*/

公共布尔isFinished() {

返回IMPL.isFinished(mEdgeEffect);

}

/**

* 立即完成当前动画。

* 调用后{@link #isFinished()} 将返回true。

* 立即结束动画

*/

公共无效完成(){

IMPL.finish(mEdgeEffect);

}

/**

* 处理滑动时调用

* 当用户将内容从边缘拉开时,视图应该调用此方法。

* 这将更新当前视觉效果及其关联动画的状态。

* 如果使用此方法,则宿主视图应始终{@link android.view.View#invalidate()}

* 返回true 并相应地绘制结果。

*

* @param deltaDistance 自上次调用以来距离的变化。值可能是0(不变)到

* 1.f(视图的全长)或负值来表达变化

* 回到到达的边缘以启动效果。

* Range:[-1,1],即要移动的距离与View边长的比例

* @paramdisplacement 距离该点效果起始边的位移

* 启动拉动。在触摸的情况下,这是手指的位置。

* 值可能是从0-1。

* 范围[0,1],手指位置与非移动侧的比例

* @return true 如果宿主视图应该调用invalidate,如果不应该则返回false。

* 如果返回true,则表示View会被刷新。

*/

公共布尔onPull(浮点deltaDistance,浮点位移){

return IMPL.onPull(mEdgeEffect, deltaDistance, 位移);

}

/**

* 对象被拉动后释放时调用。

* 这将开始效果的“衰减”阶段。调用该方法后

* 如果使用此方法,则宿主视图应该{@link android.view.View#invalidate()}

* 返回true,从而绘制相应的结果。

* 是否释放

* @return true 如果宿主视图应该无效,如果不应该则返回false。

*/

公共布尔onRelease() {

返回IMPL.onRelease(mEdgeEffect);

}

/**

* 当效果以给定速度吸收冲击时调用。

* 当fling 到达滚动边界时使用。

*

* 吸收一个速度,当到达View的边界时,就会显示相应的动画。

*当使用{@link android.widget.Scroller}或{@link android.widget.OverScroller}时,

* getCurrVelocity 方法将提供合理的近似值

* 在这里使用。

*

* @param速度撞击时的速度,以每秒像素为单位。

* @return true 如果宿主视图应该无效,如果不应该则返回false。

*/

公共布尔onAbsorb(int 速度) {

返回IMPL.onAbsorb(mEdgeEffect, 速度);

}

/**

* Key方法,在View的onDraw方法中调用时,会显示对应的动画。调用该方法之前必须计算相应的动画。

* 平移、旋转量。

* 绘制到提供的画布中。假设画布已旋转

* 相应地尺寸已设置。效果将绘制完整

* X=0 到X=width 的宽度,从Y=0 开始并延伸到小于的某个因子

* 1.f 的高度。

*

* @param canvas 要绘制的画布

* @return true 如果绘图应该继续超出此帧以继续

* 动画片

*/

公共布尔绘制(画布画布){

返回IMPL.draw(mEdgeEffect, 画布);

}EdgeEffectCompat实现原理:

EdgeEffcetCompat的实现是当滑动控件滑动到边框时,在边框上画一条圆弧,然后根据

滑动位置(滑动方向的偏移量,非滑动方向坐标的位置)进行缩放和平移,同时播放动画。

详情如下(蓝色部分):

示意图

2,EdgeEffectCompat类的应用

这里我利用ScrollView的相关源码来研究展示EdgeEffectCompat是如何应用到View上的。

View的绘制过程中,通过EdgeEffectCompat.setSize(width,height)和EdgeEffectCompat.draw(canvas)两个方法来绘制效果图。详细解释见评论:@Override

protected void onDraw(Canvas 画布) {

super.onDraw(画布);

如果(mTopEdgeEffect!=null){

最终int 宽度=getWidth() - getPaddingRight() - getPaddingLeft(); //内容宽度

Final int scrollY=getScrollY();//当前滑动量

if (!mTopEdgeEffect.isFinished()) {//动画是否已经结束

int RestoreCount=canvas.save();

canvas.translate(getPaddingLeft(), Math.min(0,scrollY));//画布向右平移。如果View向下偏移超过0,则必须再次向上偏移,平移超过上边界。

mTopEdgeEffect.setSize(width, getHeight());//设置效果的显示范围(内容的宽度,View的高度)

if (mTopEdgeEffect.draw(canvas)) {//绘制边缘效果图,如果绘制需要动画效果,返回true

ViewCompat.postInvalidateOnAnimation(this); //动画片

}

canvas.restoreToCount(restoreCount);

}

如果(!mBottomEdgeEffect.isFinished()){

int RestoreCount=canvas.save();

//下面两行代码的作用是将画布平移旋转到底部进行显示,向上显示的效果。

canvas.translate(getPaddingLeft() - 宽度, Math.max(getScrollRange(),scrollY) + getHeight());

画布.旋转(180,宽度,0);

mBottomEdgeEffect.setSize(宽度, getHeight());

如果(mBottomEdgeEffect.draw(画布)){

ViewCompat.postInvalidateOnAnimation(this);

}

canvas.restoreToCount(restoreCount);

}

}

}在View.onTouchEvent()方法中调用EdgeEffectCompat.onPull方法。详情参见源码:@Override

公共布尔onTouchEvent(MotionEvent ev) {

最终int actionMark=MotionEventCompat.getActionMasked(ev);

开关(动作标记){

案例MotionEvent.ACTION_MOVE:

最终int pointIndex=ev.findPointerIndex(mActionPointerId);

if (pointIndex==-1) {

休息;

}

最终int y=(int) ev.getY(pointIndex);

int deltaY=mLastPointY - y;

if (!mIsBeingDragged Math.abs(deltaY) mTouchSlop) {

ViewParent 父=getParent();

如果(父!=null){

父.requestDisallowInterceptTouchEvent(true);

}

if (deltaY 0) {//减去累计金额

deltaY -=mTouchSlop;

} 别的{

deltaY +=mTouchSlop;

}

mIsBeingDragged=true;

}

如果(mIsBeingDragged){

最终int oldY=getScrollY();

最终int range=getScrollRange();

最终int overMode=getOverScrollMode();

boolean canOverScroll=overMode==View.OVER_SCROLL_ALWAYS

|| (overMode==View.OVER_SCROLL_IF_CONTENT_SCROLLS 范围0);

//主要代码

如果(可以滚动){

//边缘效果

确保发光();

最终int pullToY=oldY + deltaY;

if (pullToY 0) {//在顶部

mTopEdgeEffect.onPull((float) deltaY/getHeight(), ev.getX(pointIndex)/getWidth());

如果(!mBottomEdgeEffect.isFinished()){

mBottomEdgeEffect.onRelease();

}

} else if (pullToY range) {//在底部

mBottomEdgeEffect.onPull((float) deltaY/getHeight(), 1.0f - ev.getX(pointIndex)/getWidth());

如果(!mTopEdgeEffect.isFinished()){

mTopEdgeEffect.onRelease();

}

}

if (mTopEdgeEffect !=null (!mTopEdgeEffect.isFinished() || !mBottomEdgeEffect.isFinished())) {

ViewCompat.postInvalidateOnAnimation(this);

}

}

mLastPointY=y;

}

休息;

案例MotionEvent.ACTION_CANCEL:

如果(mTopEdgeEffect!=null){

mTopEdgeEffect.onRelease();

mBottomEdgeEffect.onRelease();

}

休息;

案例MotionEvent.ACTION_UP:

如果(mTopEdgeEffect!=null){

mTopEdgeEffect.onRelease();

mBottomEdgeEffect.onRelease();

}

休息;

}

返回真;

}

私人无效确保Glows(){

if (getOverScrollMode() !=OVER_SCROLL_NEVER) {

上下文上下文=getContext();

如果(上下文!=null mTopEdgeEffect==null){

mTopEdgeEffect=new EdgeEffectCompat(context);

mBottomEdgeEffect=new EdgeEffectCompat(context);

}

} 别的{

mTopEdgeEffect=null;

mBottomEdgeEffect=null;

}

}当你快速滑动View时,View会以一定的速度到达边界。这时会按照到达边界的速度来显示。

一般View都是使用Scroller来进行Fling动画效果的。这时候就必须在View.computeScroll方法中进行设置。详细信息如下:@Override

公共无效computeScroll(){

如果(mScroller.computeScrollOffset()){

int oldX=getScrollX();

int oldY=getScrollY();

int newX=mScroller.getCurrX();

int newY=mScroller.getCurrY();

//Log.i(TAG, "computeScroll: oldY : " + oldY +" newY : "+newY);

if (oldX !=newX || oldY !=newY) {

最终int range=getScrollRange();

最终int overMode=getOverScrollMode();

boolean canOverScroll=overMode==View.OVER_SCROLL_ALWAYS

|| (overMode==View.OVER_SCROLL_IF_CONTENT_SCROLLS 范围0);

overScrollByCompat(newX - oldX, newY - oldY, oldX, oldY, 0, 范围, 0, 0);

if (canOverScroll) {//这部分是可怕的边缘效果

确保发光();

if (newY 0 oldY 0) {//到达顶部,吸收速度

mTopEdgeEffect.onAbsorb((int) mScroller.getCurrVelocity());

} else if (newY range oldY range) {//到达底部并吸收速度

mBottomEdgeEffect.onAbsorb((int) mScroller.getCurrVelocity());

}

}

}

}

关于深入解析Android边缘效果类EdgeEffectCompat:全面学习指南和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

用户评论

ヅ她的身影若隐若现

看起来是个技术干货!Android开发中遇到过边框效果问题吗?

    有14位网友表示赞同!

追忆思域。

想要了解更多关于EdgeEffectCompat的使用方法,这篇文章正好合适。

    有7位网友表示赞同!

刺心爱人i

我经常在设计手机屏幕边缘交互体验的时候会用到类似的效果。

    有19位网友表示赞同!

情如薄纱

分享一下你学习到的EdgeEffectCompat的知识点吧!

    有8位网友表示赞同!

呆萌

这个学习笔记能帮助我更好地解决Android布局中的边框问题,感谢分享。

    有18位网友表示赞同!

优雅的叶子

学习android进阶知识总让人兴奋! 边缘效应一直是开发中比较难把握的部分,期待能有更详细的研究和应用实例。

    有17位网友表示赞同!

服从

感觉这个边效应效果可以提高APP用户体验,尤其是滑动返回操作更加流畅。

    有8位网友表示赞同!

志平

平时开发的时候,EdgeEffectCompat的使用场景不太多,但了解相关的原理还是挺好。

    有6位网友表示赞同!

雨后彩虹

我最近也在学习Android边缘特效的知识,希望这篇文章能够提供一些具体的例子和代码示例。

    有10位网友表示赞同!

半梦半醒半疯癫

原来这个EdgeEffectCompat能处理很多种边缘效果,可以进一步提升应用程序的美观度!

    有10位网友表示赞同!

话少情在

看了标题我的第一反应就是想看看哪些手机系统自带这些的效果,具体是如何实现的?

    有7位网友表示赞同!

一样剩余

对于Android开发来说,学习相关的库和技巧都是很有必要的,能够让我们写出更多高效的美观的代码。

    有20位网友表示赞同!

一生荒唐

希望这篇文章能详细讲解EdgeEffectCompat的使用方法,包括各种参数的解释和实际案例展示。

    有6位网友表示赞同!

坏小子不坏

边框效果设计好坏直接影响用户体验,这个学习笔记应该非常有实用价值!

    有10位网友表示赞同!

←极§速

看来Android开发的知识系统越来越深了,需要多加努力才能跟上潮流。

    有14位网友表示赞同!

败类

在学习过程中遇到困难吗? 可以在这里分享一下你的经验和困惑,互相交流学习。

    有13位网友表示赞同!

汐颜兮梦ヘ

我比较好奇EdgeEffectCompat相比于其他类似方案有什么优势?

    有20位网友表示赞同!

清羽墨安

期待看到更多关于Android边缘效应的学习资源和实践经验分享。

    有8位网友表示赞同!

夜晟洛

对于开发人员来说,不断提升自己的技术能力是很有必要的!

    有9位网友表示赞同!

【深入解析Android边缘效果类EdgeEffectCompat:全面学习指南】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:探索1111商场:一站式购物天堂 下一篇:《论语》精华解读:第23篇——不议是非的智慧