SurfaceView视觉优化实战:圆角与渐变蒙层的完美结合

Android SurfaceView圆角与渐变蒙层实战:让你的视频播放器颜值翻倍 本文详细解析了Android SurfaceView圆角与渐变蒙层的实现原理与优化技巧,帮助开发者提升视频播放器的视觉体验。通过ViewOutlineProvider的底层机制、性能优化实践以及高级渐变蒙层设计,打造更具沉浸感的播放界面。文章还涵盖了复合效果的工程化实践和高级定制方案,适用于各种移动应用场景。 阅读详情

1. 为什么你的SurfaceView看起来“平平无奇”?

如果你正在开发一个视频播放器、一个直播应用,或者是一个游戏界面,你很可能已经和SurfaceView打过交道了。SurfaceView是Android中一个非常特殊的视图组件,它拥有自己独立的绘图表面(Surface),可以直接由GPU或MediaCodec等硬件加速单元进行渲染。这带来的好处是性能极高,视频解码、复杂的游戏画面都能流畅播放。但用过它的朋友都知道,SurfaceView有个让人头疼的“毛病”:它像个特立独行的艺术家,不太遵守Android视图系统的“装修规则”。

什么意思呢?我们平时给普通的View,比如一个ImageView或者一个TextView,加个圆角边框,或者加个渐变阴影,那是轻而易举的事情。几行XML或者调用setCornerRadius就能搞定。但这一套在SurfaceView身上,基本就失灵了。你可能会发现,你设置的圆角属性根本没效果,SurfaceView依然是个直愣愣的矩形;你想在上面叠加一个半透明的渐变蒙层来提升视觉层次感,结果要么不显示,要么把整个视频内容都给盖住了。最后做出来的界面,功能是强大了,但视觉效果却显得很“糙”,和App其他精致的部分格格不入。

这背后的原因,就在于SurfaceView的渲染机制。它不像普通View那样在应用的主UI线程中进行绘制,而是将内容直接绘制到一块由系统管理的、离屏的Surface上。这块Surface是独立于View层级体系的,因此很多基于View树的属性设置和裁剪操作,对它就无效了。但这绝不意味着我们只能妥协。恰恰相反,正是因为它的“不普通”,我们才需要一些特别的技巧来“驯服”它,让它既保持高性能的渲染能力,又能完美融入我们精心设计的UI之中。

今天,我就来和你详细聊聊,我是如何在实际项目中解决这个痛点的。核心就是两件事:给SurfaceView加上流畅的圆角,以及叠加一个自然不突兀的渐变蒙层。我会把代码掰开了、揉碎了讲给你听,不仅告诉你怎么做,还会解释为什么这么做,以及我踩过哪些坑。目标很简单:让你看完就能动手,做出既流畅又好看的视觉界面。

2. 攻克第一关:为SurfaceView实现完美圆角

给View加圆角,最常见的方法是使用CardView或者给背景设置一个圆角的ShapeDrawable。但这些方法对SurfaceView统统无效。因为SurfaceView的内容并不在它自身的View画布上,所以裁剪View的形状并不能裁剪其内容。我们需要换一个思路,从系统层面去告诉它:“请只显示这个圆角区域里面的东西”。

2.1 核心武器:ViewOutlineProvider

从Android 5.0(API 21)开始,系统引入了ViewOutlineProvider这个类,它专门用来定义视图的外轮廓。这个轮廓会影响到视图的阴影(Elevation)和裁剪(Clip)效果。我们的圆角方案,就建立在它的基础上。

先直接上代码,这是我经过多次调试后最稳定的一版:

/**
 * 为SurfaceView设置圆角
 * @param radius 圆角半径,单位像素(px)
 */
private void setSurfaceViewCorner(final float radius) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        mSurfaceView.setOutlineProvider(new ViewOutlineProvider() {
            @Override
            public void getOutline(View view, Outline outline) {
                // 获取视图在屏幕上的可见矩形区域
                Rect rect = new Rect();
                view.getGlobalVisibleRect(rect);
                
                // 计算轮廓的矩形区域。这里通常从(0,0)开始到视图的宽高。
                // 使用getGlobalVisibleRect获取的rect需要转换,因为outline是基于视图自身坐标系的。
                // 更稳健的写法是直接使用视图的宽高:
                int leftMargin = 0;
                int topMargin = 0;
                int width = view.getWidth();
                int height = view.getHeight();
                
                // 创建一个相对于视图自身左上角(0,0)的矩形
                Rect selfRect = new Rect(leftMargin, topMargin, width - leftMargin, height - topMargin);
                
                // 关键一步:将圆角矩形轮廓设置给outline
                outline.setRoundRect(selfRect, radius);
            }
        });
        // 必须调用此方法,裁剪才会生效
        mSurfaceView.setClipToOutline(true);
    } else {
        // 对API 21以下的兼容处理,后文会讲
        Log.w(TAG, "setSurfaceViewCorner: Requires API level 21+");
    }
}

这段代码看起来不长,但有几个关键点我踩过坑,必须提醒你:

  1. 矩形区域的计算:早期我直接使用getGlobalVisibleRect(rect)得到的rect来设置,结果在某些有父容器偏移的情况下,圆角位置会错乱。原因是outline需要的坐标系是视图自身的本地坐标系,原点(0,0)是视图的左上角。所以最保险的做法是直接用view.getWidth()和view.getHeight()来构造矩形。代码里的leftMargin和topMargin通常为0,如果你希望轮廓比视图小一圈(比如实现一个内缩的圆角效果),可以在这里调整。

  2. setClipToOutline(true)是灵魂:这个方法调用告诉系统:“请严格按照我提供的轮廓来裁剪这个视图的内容。”对于SurfaceView,正是这个调用,才使得系统对其独立的Surface内容也进行了裁剪。忘记调用它,一切圆角设置都是白费功夫。

  3. API版本检查:这个特性要求API 21+,在旧设备上需要做降级处理。虽然现在低版本设备不多了,但严谨的代码还是应该加上判断。

2.2 实战中的坑与优化方案

直接把上面的代码拿去用,在大部分情况下已经能工作了。但如果你追求极致的兼容性和稳定性,特别是面对动态改变大小、或者叠加了其他动画的场景,还有以下几点需要注意:

坑一:SurfaceView初始化时机。 你不能在onCreate里一拿到SurfaceView引用就立刻调用setSurfaceViewCorner。因为那时视图还没有完成测量和布局,getWidth()和getHeight()返回的都是0。我通常会在onWindowFocusChanged里调用,或者给SurfaceView添加一个OnGlobalLayoutListener监听,确保在布局完成后再设置圆角。

坑二:圆角边缘锯齿。 在某些低端设备或特定Android版本上,圆角边缘可能会出现锯齿(Aliasing),看起来不够平滑。一个有效的缓解方案是开启视图的硬件层加速,并设置一个抗锯齿标志:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    mSurfaceView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    // 在getOutline方法中设置轮廓后,可以尝试设置抗锯齿(效果因系统而异)
    // outline.setAlpha(0.99f); // 一个取巧的办法,有时能触发更好的抗锯齿处理
}

坑三:兼容Android 5.0以下版本。 对于必须支持老版本的应用,圆角方案需要回退。一个常见的做法是使用一个中间层:将SurfaceView放在一个FrameLayout中,然后为这个FrameLayout设置一个圆角的背景,并让背景的中间部分透明。但这种方法无法裁剪SurfaceView的内容,只能营造“视觉上有圆角”的假象,如果背景是动态变化的视频,边缘会露馅。另一种更彻底的方案是使用TextureView替代SurfaceView,TextureView本身是普通View体系的一员,支持所有标准的变换和裁剪,但性能开销会比SurfaceView稍大,特别是全屏视频场景。

3. 叠加第二层美感:渐变蒙层的艺术

解决了圆角,我们再来看看渐变蒙层。为什么需要它?想象一下视频播放器的场景:在视频底部,通常会有一些控制按钮(播放/暂停、进度条)。如果按钮直接放在视频画面上,当视频画面是白色或浅色时,按钮文字就会看不清。这时候,一个从底部向上、由深色到透明的渐变蒙层,就能完美解决这个问题。它既能提供一个舒适的背景来衬托控件,又不会完全遮挡视频内容,保持了画面的通透感。

3.1 使用android:foreground属性

Android View有一个android:foreground属性,它可以在视图内容的前面绘制一层东西。这简直就是为我们的蒙层需求量身定做的。而且,经过我的测试,这个属性对SurfaceView是有效的!

首先,我们在XML布局文件中定义SurfaceView,并为其添加foreground属性:

<com.example.myapp.CustomSurfaceView
    android:id="@+id/sv_player"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:foreground="@drawable/foreground_gradient"
    />

这里我习惯为SurfaceView创建一个自定义类CustomSurfaceView,方便集中管理一些逻辑,当然直接用SurfaceView也行。

接下来,就是创建这个foreground_gradient.xml文件,它放在res/drawable目录下。

3.2 精心设计渐变Drawable

蒙层效果的好坏,全看这个渐变Drawable怎么设计。原始文章给了一个上下往中间渐变的例子,我这里再分享几个更常用的场景和对应的代码。

场景一:底部控件栏衬底(最常用) 这是一个从底部向上,由半透明黑色到完全透明的线性渐变,高度约占视图的30%。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:type="linear"
        android:angle="90" <!-- 角度为90度,表示从上到下渐变 -->
        android:startColor="#00000000" <!-- 顶部完全透明 -->
        android:centerColor="#80000000" <!-- 中间位置为50%透明度的黑色 -->
        android:centerY="0.7" <!-- 中间色的位置在70%高度处 -->
        android:endColor="#E6000000" <!-- 底部为90%透明度的黑色,更暗 -->
        />
</shape>

参数解读:

  • angle=“90”:渐变方向为从上到下。因为我们想要底部深、顶部浅,所以颜色定义要反过来,startColor在顶部(透明),endColor在底部(深色)。
  • centerY=“0.7”:这个属性非常关键!它决定了centerColor所在的位置。设为0.7,意味着从视图高度70%的地方开始,颜色迅速向endColor过渡,这样能确保底部大约30%的区域有一个较深且均匀的衬底,适合放置按钮和文字。
  • 颜色值格式是#AARRGGBB。AA是透明度(00完全透明,FF完全不透明),RRGGBB是颜色。#80000000就是50%透明度的黑色。

场景二:边缘晕染(Vignette)效果 这种效果常见于图片或视频预览,让四周暗下去,引导视线聚焦中心。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:type="radial" <!-- 使用径向渐变 -->
        android:gradientRadius="70%" <!-- 渐变半径 -->
        android:centerX="0.5"
        android:centerY="0.5"
        android:startColor="#00000000" <!-- 中心透明 -->
        android:endColor="#CC000000" <!-- 边缘80%透明度黑色 -->
        />
</shape>

场景三:动态蒙层(代码控制) 有时候我们需要蒙层可以动态显示或隐藏,比如用户点击屏幕时才出现控制栏和蒙层。这时候就不能只依赖XML了。

  1. 首先,创建一个不设foreground的SurfaceView。
  2. 在代码中,准备一个和上面XML效果一样的GradientDrawable。
  3. 使用ViewOverlay来动态添加和移除这个蒙层。
// 创建渐变Drawable
GradientDrawable gradientDrawable = new GradientDrawable();
gradientDrawable.setShape(GradientDrawable.RECTANGLE);
// 设置渐变,参数对应XML中的属性
gradientDrawable.setOrientation(GradientDrawable.Orientation.TOP_BOTTOM);
int[] colors = {Color.TRANSPARENT, Color.parseColor("#80000000"), Color.parseColor("#E6000000")};
gradientDrawable.setColors(colors);
// 注意:GradientDrawable的setColors方法不支持直接定义centerY,动态实现复杂渐变需要更细致的处理。
// 对于精确的centerY控制,建议使用XML资源,然后通过getDrawable获取并修改。

// 更推荐的做法:从XML加载
GradientDrawable dynamicGradient = (GradientDrawable) ContextCompat.getDrawable(context, R.drawable.foreground_gradient);

// 显示蒙层
mSurfaceView.getOverlay().add(dynamicGradient);

// 隐藏蒙层
mSurfaceView.getOverlay().remove(dynamicGradient);

使用ViewOverlay的好处是它不会影响视图本身的布局和测量,添加和移除都非常高效,适合做动态效果。

4. 强强联合:圆角与渐变蒙层的协同作战

现在,我们手里有了两件武器:圆角裁剪和渐变蒙层。单独使用它们都能提升视觉效果,但如果能同时使用,效果会加倍。想象一下,一个带有圆角的视频窗口,底部还有一个优雅的渐变控制栏衬底,这质感立刻就上来了。

但是,直接同时设置setClipToOutline和android:foreground,可能会遇到一个问题:前景(蒙层)也被圆角裁剪了。这会导致蒙层的四个角也被切掉,看起来不完整。这不一定是我们想要的效果。我们可能希望蒙层能覆盖整个矩形区域,包括圆角以外的部分,或者至少能完整显示。

如何解决这个冲突?这需要我们对视图的绘制层级有更深的理解。

4.1 方案一:蒙层置于父容器(推荐)

这是最清晰、耦合度最低的方案。我们不把蒙层直接设为SurfaceView的前景,而是将SurfaceView和一个专门用于显示蒙层的View(比如一个简单的View,背景设为我们的渐变Drawable)一起放在一个父容器(如FrameLayout)中。然后,只对SurfaceView做圆角裁剪,父容器和蒙层View保持矩形。

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:background="@color/black"> <!-- 父容器背景,可匹配SurfaceView底色 -->

    <!-- SurfaceView,应用圆角裁剪 -->
    <com.example.myapp.CustomSurfaceView
        android:id="@+id/sv_player"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- 蒙层View,盖在SurfaceView之上,不受圆角影响 -->
    <View
        android:id="@+id/view_overlay"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/foreground_gradient" />

    <!-- 其他控件,如播放按钮、进度条,放在蒙层View之上 -->
    <ImageButton
        android:id="@+id/btn_play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/ic_play" />

</FrameLayout>

在这个结构里:

  1. FrameLayout是舞台。
  2. SurfaceView是演员,被剪裁成圆角形状。
  3. View(蒙层)是覆盖在演员身上的半透明纱幕,它本身是矩形的,但由于演员是圆角,纱幕在圆角区域外会覆盖到舞台背景(黑色)。这通常是可以接受的,甚至效果更好,因为圆角外的暗色区域和蒙层融为一体。
  4. 控制按钮放在最上层。

我们在代码中,只需要对sv_player调用setSurfaceViewCorner方法即可。蒙层和控制按钮的显示/隐藏,通过控制view_overlay和btn_play的可见性来实现。

4.2 方案二:自定义SurfaceView,控制绘制顺序

如果你希望所有元素都封装在一个自定义View内,可以继承SurfaceView,并重写它的draw方法或使用ViewOverlay。思路是在SurfaceView自身的绘制完成后,再在其上绘制蒙层。但要注意,SurfaceView的绘制是异步的,直接在其Canvas上绘制可能无效。更稳妥的做法是使用方案一中的父容器叠加方式,或者使用TextureView(它更像一个普通View,绘制顺序更容易控制)。

5. 性能考量与最佳实践

加入了视觉效果,我们绝对不能以牺牲SurfaceView的核心优势——性能为代价。下面是一些性能优化的经验之谈:

  1. 圆角裁剪的开销:setClipToOutline开启后,系统需要进行额外的离屏缓冲和混合操作,这会带来一定的GPU开销。在极其老旧的低端设备上,如果同时渲染多个带圆角的SurfaceView(比如视频列表),可能会观察到轻微的帧率下降。我的建议是:按需启用。 对于静态或低频更新的界面(如播放器主窗口),可以放心使用。对于每秒变化多次的游戏界面或动画,需要在实际设备上测试性能。

  2. 渐变蒙层的优化:使用XML shape定义的渐变,在绘制时是由CPU光栅化的。如果蒙层非常复杂(比如多重渐变、形状复杂),可以考虑将其预渲染为一张Bitmap,或者使用简单的纯色半透明层。对于简单的线性/径向渐变,现代设备的性能足以应对。

  3. 硬件层(Hardware Layer)的妙用:正如前面提到的,开启硬件层可以提升圆角渲染的效率和平滑度。但硬件层会消耗额外的显存。一个平衡的做法是,在动画开始前为View开启硬件层(setLayerType(View.LAYER_TYPE_HARDWARE, null)),在动画结束后关闭它(setLayerType(View.LAYER_TYPE_NONE, null))。对于静态显示的圆角SurfaceView,可以一直开启。

  4. 避免过度绘制:方案一中,我们在FrameLayout里叠加了多个View。要确保蒙层View在不需要时(比如全屏播放模式)将其可见性设为GONE而不是INVISIBLE,GONE可以避免布局测量和绘制。同时,父容器的背景色如果和SurfaceView内容无关,也应考虑移除。

  5. 测试,测试,再测试:视觉效果在不同Android版本、不同厂商ROM上的表现可能存在差异。务必在你能找到的最多的真机上进行测试,特别是圆角的锯齿问题和蒙层的透明度表现。

SurfaceView渐变蒙层实战:让你的视频播放器更专业 本文深入探讨了在Android视频播放器开发中,如何为SurfaceView或TextureView实现专业的渐变蒙层效果。针对SurfaceView独立绘图表面导致常规View属性失效的挑战,文章提供了叠加层和自定义绘制两种实战方案,并详细解析了圆角适配、性能优化以及与TextureView的选择策略,助力开发者打造视觉体验更佳的专业播放器。 阅读详情

相关推荐

Android SurfaceView圆角实现全攻略:从基础到高级(附完整代码)

本文全面解析了Android SurfaceView实现圆角效果的多种方案。从基础的ViewOutlineProvider轮廓裁剪,到结合自定义ViewGroup与渐变蒙层的中级方案,再到使用TextureView替代的高级方案,详细分析了各方法的原理、代码实现与适用场景,并提供了ExoPlayer视频播放器的实战案例,帮助开发者解决SurfaceView与现代化UI设计规范融合的难题。

weixin_29212867的博客 149

SurfaceView实现圆角矩形预览

android中,文本、按钮实现圆角样式只需要在其背景中定义corners属性设置radius即可。 在SurfaceView中同样可以实现此种效果,以丰富预览样式。 比如用SurfaceView要实现圆角矩形预览的效果,自定义View继承于SurfaceView,然后重写其draw方法,这点不同于ImageView实现圆角效果,ImageView要重写其onDraw方法。具体代码,如下。 ...

浅颜如梦 1万+

Android骨架屏零侵入实现:基于ViewOverlay的加载体验优化方案

在移动应用开发中,页面加载时的白屏状态是影响用户体验的关键问题,容易引发用户流失。骨架屏作为一种加载占位技术,通过在内容加载完成前展示页面布局的灰色轮廓,有效缓解用户的等待焦虑。其实现原理是在视图绘制流程中插入占位元素,为真实内容提供视觉预期。从技术价值看,优秀的骨架屏方案能显著提升应用感知性能,增强用户对应用稳定性的信任。在Android开发场景中,传统实现往往需要修改布局文件或引入复杂框架,带来较高维护成本。本文介绍的ViewOverlay方案,通过系统级视图覆盖机制,实现了对现有代码零侵入的骨架屏接入

weixin_30443731的博客 393

为SurfaceView设置圆角方式

private void setSurfaceViewCorner(final float radius) { mDisplaySurfaceView.setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { Rect rect = new ...

dfsfsfsdfdsf的博客 6460

为SurfaceView设置效果(圆角、渐变蒙层)

为SurfaceView绘制边框,自定义CustomSurfaceView继承SurfaceView public CustomSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); paint = new Paint(); paint.setColor(getResources().getColor

分享技术与经验的博客 2481

Android开发摄像头SurfaceView预览 背景画图(矩形和圆形) 实现(双surfaceview,顶层画矩形框,底层预览视频)

Android开发摄像头SurfaceView预览 背景画图(矩形和圆形) 实现(双surfaceview,顶层画矩形框,底层预览视频); UI:三个按钮 预览 摄像 图片保存,预览界面 可以显示(矩形和圆形等图画)

Android FrameLayout和SurfaceView设置圆角

最近有一个需求就是把渲染视频的界面设置圆角,这个界面父布局是一个FrameLayout,里面是一个SurfaceView,下面是怎么设置圆角,其实如果父布局没有界面的设置的话,直接对SurfaceView设置圆角即可。

guoyangdnb的博客 1067

android surfaceview 悬浮窗圆角 windowmanager

android surfaceview圆角

Android SurfaceView圆角+渐变蒙层实战:让你的视频播放器颜值翻倍

本文详细解析了Android SurfaceView实现圆角和渐变蒙层的技术挑战与解决方案。通过双缓冲层+离屏渲染的高性能方案,解决了SurfaceView圆角裁剪失效和层级覆盖问题,同时提供了动态渐变蒙层的进阶实现方法,显著提升视频播放器的视觉体验和性能表现。

weixin_29209801的博客 236

TI 实时操作系统SYS/BIOS使用总结

1:概述: SYS/BIOS 是一个可扩展的实时的操作系统。具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片)。能够实现系统的模块化并可裁剪。 最大的特点就是:实时。 2:XDCtools: XDCtools 是SYS/BIOS引用的一种实时的软件组件技术(RTSC),它包括一些有用的工具,标准的AP

带头奋青的博客 5万+

2025小红书跳转卡片实战指南:从零搭建独立后台与自动化发卡系统

本文提供了一份2025年小红书跳转卡片的实战搭建指南,详细解析了独立后台系统的核心架构与自动化发卡流程。文章从零开始,手把手教你使用Node.js、Vue.js等技术栈构建包含后台管理、用户制卡中心与前端交互的完整系统,旨在帮助运营者实现合规引流,并掌握数据自主权与自动化运营能力。

weixin_29234423的博客 518

Flutter渐变实战:BoxDecoration与GradientAppBar双路径详解

渐变是Flutter UI中提升视觉质感的基础技术,其本质是在归一化坐标系中进行颜色空间映射,而非简单色彩混合。理解LinearGradient的begin/end坐标逻辑、stops插值机制及tileMode填充策略,是避免‘渐变不显示’‘色带断裂’‘真机渲染异常’等高频问题的关键。在工程实践中,BoxDecoration依赖容器尺寸约束,而GradientAppBar需严格履行PreferredSizeWidget布局契约,并响应滚动与深色模式。本文聚焦Flutter稳定通道v3.22+实测方案,覆盖线

weixin_30372371的博客 421

Habitat-baselines v0.1.7防踩坑手把手带你跑通(全网唯一)

Habitat-baselines v0.1.7防踩坑手把手带你跑通(全网唯一)

shannanshouyin的博客 1278

Android性能优化:GPU呈现模式与过度绘制检测实战指南

在Android应用开发中,图形渲染性能是影响用户体验的关键因素。渲染管线是图形系统的基础,它描述了从CPU准备绘制命令到GPU光栅化像素,最终显示到屏幕的完整流程。理解渲染管线的原理,有助于定位性能瓶颈,提升应用流畅度。GPU呈现模式分析工具通过可视化每一帧的渲染耗时,帮助开发者精准识别丢帧和卡顿的根源。过度绘制检测则揭示了无效的绘制操作,这些操作会浪费GPU算力,增加填充率负担。掌握这两项工具,对于优化复杂UI、提升滚动和动画性能具有重要价值。本文聚焦Android GPU呈现与过度绘制,通过实战案例,

weixin_34185320的博客 422

Vue3 - 超详细最新 wangEditor V5 富文本编辑器安装引入及使用教程,提供工具栏配置、基础富文本功能、API使用示例教程等(新手小白快速引入并植入到项目中)

vue3,wangEditorv5富文本编辑器,wangEditorv5官方文档,vue3最新安装wangEditorv5富文本详细使用教程,vue3使用wangEditorv5编辑器示例代码,vue3网站网页安装植入富文本编辑器教程,vue3wangEditor使用api,vue3安装富文本控制台出现报错如何解决,vue3wangEditor-v5工具栏配置,vue3中使用富文本编译器wangEditor5的方法,wangeditor5在vue3中的全使用过程,vue3超详细最新wangedi

🏆 前端领域优质创作者 4253

你以为你懂 Java 反射?看了这篇源码分析,我发现我以前都错了

摘要:本文讲述了一次生产环境Metaspace内存溢出的故障排查经历。事故源于一个通用数据导出功能中频繁使用反射调用method.invoke(),触发了JVM的"膨胀机制":当同一Method对象调用超过15次时,JVM会动态生成GeneratedMethodAccessor类,导致Metaspace被撑爆。文章分析了问题根源在于循环中反复调用getMethods()创建新Method对象,并提出了三种解决方案:缓存Method对象、改用MapStruct/MethodHandle工具

BUG猿的博客 770

如何实现TextureView或者SurfaceView 预览框为圆角

项目中,视频预览界面框为圆角;但发现是使用的Renderer渲染的方法进行的,的确可以有圆角效果。 但有个问题是:我的视频源与要显示视频的预览框的长宽比率不同,预览框需要满屏看到视频源,如果不做处理,视频 源只能通过压缩来显示。造成了视频的变形,如果不拉伸处理,那么就进行裁剪处理,需要对视频进行Matrix操作,如 移动,伸缩处理。进行这些处理后,渲染的圆角效果就不再出现了。所以通过Rend

学习 1万+

RH850从0搭建Autosar开发环境【17】- Davinci Configurator之DCM模块配置详解(下)

RH850从0搭建Autosar开发环境【17】- Davinci Configurator之DCM模块配置详解(下)

weixin_42412049的博客 2379

Android 9上圆角无效的问题

在Android 9的系统上如果使用PorterDuffXfermode的方法实现画圆角的话会失效,官方issue地址https://issuetracker.google.com/issues/111819103,在这个帖子中谷歌回复到,有三种方法 使用android.view.ViewOutlineProvider(可以在这个示例地址https://github.com/googlesamp...

chends 1789

采用了fluent模拟了平壁面结霜过程。udf,很经典,可以试试。

利用该模型作为FLUENT中的源项,模拟了在局部冷却下冷表面上的霜形成,以预测霜的形态、温度分布和霜的重量,结果与实验结果吻合良好。结果显示,霜首先围绕冷却块形成,然后逐渐向其他方向扩展,冷却块上方的霜密度最大。随着时间的推移,平均霜厚度逐渐增加,生长速率减慢,而平均霜密度随增长速率变快而增加。相变传递微观过程与机理、蒸发及冷凝换热、强化传热、高效传热管、热泵、制冷、节水节能新技术、电子元器件冷却、余热回收及梯级利用等。udf,很经典,可以试试。工程热物理、空调、热能、低温制冷、化工、物理等。

qq_15963745的博客 923

15-YOLOV8OBB损失函数详解

在Ultralytics YOLO 模型中,OBB 由YOLO OBB 格式中的四个角点表示。这样可以更准确地检测到物体,因为边界框可以旋转以更好地适应物体。其坐标在 0 和 1 之间归一化:YOLO 在内部处理损失和输出是xywhr 格式,xy表示边界框的中心点、whr表示宽度、高度和旋转角度。

zqb_123的博客 798

Android重叠SurfaceView圆角设置

2.对于重叠的surfaceviw,上面那个surfaceview设置圆角是没有效果的,但是你把它放到下面,它其实是生效的,根据资料是surfaceview是有一个区域的,它里面的surface是跟硬件绑定的,当surfaceview下面也是一个surfaceview时,这个圆角就不生效了,可能跟view的绘制流程有关,所以推荐使用TextureView,但是这个view存在性能不好的确定,只能说各有所长。1.surfaceview的父布局要不透明才能设置圆角(只有一个surfaceview为true。

guoyangdnb的博客 589

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ViewOutlineProvider 轮廓裁剪(5.0以上特性)

ViewOutlineProvider 轮廓裁剪(5.0 以上特性) 需求: 需要把相机预览SurfaceView裁剪成圆形,ViewOutlineProvider 很好的实现了这个效果 文章目录ViewOutlineProvider 轮廓裁剪(5.0 以上特性)关于ViewOutlineProviderView 相关的方法setOutlineProvider()setClipToOutline(...

K_Hello的博客 4735

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 系统规划与管理师备考指南:2024年案例分析真题高频考点解析(附避坑技巧)
下一篇: 深入解析BigDecimal的toString()与toPlainString():科学计数法的触发条件与实际应用
lambda
博客等级 码龄23年 49粉丝 1303原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值