《转》为什么 Shape 不起作用, android的倒角不起作用

【keras-DeepLearning_Models】_obtain_input_shape() got an unexpected keyword argument 'include_top' 最近想跑一些主流的网络感受感受。从github上找到了 deep-learning-models 提供的几个模型,包括:inception-v2, inception-v3, resnet50, vgg16, vgg19 等等。这些代码都是基于 keras 框架,正好我最近有在学 tensorflow 和 keras,所以很想跑跑这些代码。心动不如行动,准备工作都做得差不多了,准备开始跑代码。此时,出现了一些常见的问题,也正好借此机会整理下来。 阅读详情

https://www.jianshu.com/p/90a264d5c610

 

Android里,我们经常会用shape去定义View的形状。如下是在xml里定义一个简单shape的代码:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="#00FF00" />
    <corners
        android:bottomLeftRadius="10dp"
        android:bottomRightRadius="10dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp" />
</shape>

使用时,将它设置在view 的背景上,有的同学这样问,如下使用shape,为什么不起作用?
第一例, 不起作用:

 <ImageView
    android:id="@+id/img_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/round_corner_rectangle"
    android:scaleType="fitXY"
    android:src="@drawable/img"/>

第二例,不起作用,看不到圆角效果

<FrameLayout    
   android:layout_width="wrap_content"   
   android:layout_height="wrap_content"    
   android:background="@drawable/round_corner_rectangle">    
   <TextView        
        android:layout_width="wrap_content"   
        android:layout_height="wrap_content" />
</FrameLayout>

第三例,TextView 有圆角,正常

<TextView
    android:background="@drawable/round_corner_rectangle"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content" />

首先,shape是什么?

以圆角矩形<shape>为例,其中 shape 标签在解析后对应于 GradientDrawable类(注意不是ShapeDrawable),即在xml里定义<shape>,运行期间会生成对应的GradientDrawable对象,同时传入xml里定义的圆角属性值。

查看GradientDrawable 源码,将看到在xml里<shape>设定的各个角圆角弧度,被传入并保存在数组mRadiusArray:

private void updateDrawableCorners(TypedArray a) {
......
            setCornerRadii(new float[] {
                    topLeftRadius, topLeftRadius,
                    topRightRadius, topRightRadius,
                    bottomRightRadius, bottomRightRadius,
                    bottomLeftRadius, bottomLeftRadius
            });
}

所以,设定shape标签即设生成drawable 对象。

  • Drawable 可以理解为:二维平面上,能画出来的图形图像,如:BitmapDrawable, ShapeDrawable, PictureDrawable, LayerDrawable, 等等派生类。Drawable 都有自己的draw() 方法,来操纵 canvas
  • canvas 画布是透明的,可以在上面涂抹任意形状,并填充上颜色、渐变等,即 Drawable

继续查看GradientDrawable源码,其绘制过程是基本图形绘制,涉及:Canvas、Path、 Paint。其中path 定义封闭形状,并设定好圆角,paint 画笔设置颜色等,最终在canvas 画布上画出图形,步骤如下:

  • path定义封闭形状代码如下:
    private void buildPathIfDirty() {
        final GradientState st = mGradientState;
        if (mPathIsDirty) {
            ensureValidRect();
            mPath.reset();
            mPath.addRoundRect(mRect, st.mRadiusArray, Path.Direction.CW);
            mPathIsDirty = false;
        }
    }
  • 画线及填充,558行:
switch (st.mShape) {
            case RECTANGLE:
                if (st.mRadiusArray != null) {
                    buildPathIfDirty();
                    // 画线及填充
                    canvas.drawPath(mPath, mFillPaint);
                    if (haveStroke) {
                        // 描边
                        canvas.drawPath(mPath, mStrokePaint);
                    }
                }

以上分析了定义一个 圆角矩形时,GradientDrawable 将在 canvas上自我绘制的过程。

View设置各种drawable为背景,怎么起作用的?

以第三例为例,设置TextView的background,先了解以下基础:

  1. TextView 继承自View基类
  2. 设置各种背景都将转化为drawable对象
  3. View 里有一个公用画布 canvas

查看View源码,View 里背景和内容的绘制步骤:

  1. 首先绘制底部 background
  2. 绘制具体的内容,通过onDraw 通知继承View类子类绘制具体内容。
   
 boolean draw(Canvas canvas, ViewGroup parent, long drawingTime) 的源码及注释 16153 行:

        /*
         * Draw traversal performs several drawing steps which must be executed
         * in the appropriate order:
         *
         *      1. Draw the background
         *      2. If necessary, save the canvas' layers to prepare for fading
         *      3. Draw view's content
         *      4. Draw children
         *      5. If necessary, draw the fading edges and restore layers
         *      6. Draw decorations (scrollbars for instance)
         */

        // Step 1, draw the background, if needed
        int saveCount;

        if (!dirtyOpaque) {
            drawBackground(canvas);
        }

        // 接着,绘制内容,dispatchDraw 通知该 View 上的子结点进行自我绘制。

        // skip step 2 & 5 if possible (common case)
        final int viewFlags = mViewFlags;
        boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0;
        boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0;
        if (!verticalEdges && !horizontalEdges) {
            // Step 3, draw the content
            if (!dirtyOpaque) onDraw(canvas);

            // Step 4, draw the children
            dispatchDraw(canvas);

            // Overlay is part of the content and draws beneath Foreground
            if (mOverlay != null && !mOverlay.isEmpty()) {
                mOverlay.getOverlayView().dispatchDraw(canvas);
            }

            // Step 6, draw decorations (foreground, scrollbars)
            onDrawForeground(canvas);

            // we're done...
            return;
        }

绘制Background 的过程,简化一下即为drawable 直接调用自身 draw 方法,在同一画布上进行绘制。

  private void drawBackground(Canvas canvas) {
        final Drawable background = mBackground;
…

            background.draw(canvas);

    }

以上分析解释了View绘制背景和内容的区别,同时,也顺便可以解释Imageview 的 background 和 src 的不同之处:

  1. 本质上无区别,都是各种不同类型的drawable,本质上都通过自身的draw方法在canvas上绘制。
  2. background 是背景,首先会在View基类的draw里被绘制。src 是内容,随后在子类ImageView的 ondraw 里被绘制。

这里验证一下,如果将 android:background=“@null” 会发生什么

  <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:text="此处背景透明"
        android:layout_alignParentBottom="true"/>

会发现,将会取和设置 transparent 也是一样透明的效果。

将会看到,是和设置背景为 transparent 一样透明的效果。

回头来看文中开头处提到的shape不起作用的例子:
第二例
其中TextView为外部 FrameLayout 的子结点,外部FrameLayout设置的的标签与TextView无关,TextView的绘制范围仅宽高受FrameLayout的影响,标签只代表了一个图像,不影响子节点。
解决方法:
FrameLayout 设置padding, 或者TextView设置 margin,padding要大于等于sqrt(r),其中r为所设圆角半径值,并且两者背景颜色一致。为何为sqrt(r),请自行画图计算。

第一例
ImageView 设置圆角为何不起作用。参见 ImageView 里源码,src 对应 mDrawable,绘制时,将覆盖底层 background,即设置了圆角的drawable。

    private void updateDrawable(Drawable d) {
……
       mDrawable = d;
}

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
…
            mDrawable.draw(canvas);

    }

解决办法
那该怎么给ImageView 画圆角呢?办法是通过paint 的SRC_IN模式:
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

SRC_IN 模式设置后,将两个绘制的效果叠加后取交集后展现,比如:第一个绘制的是个圆形,第二个绘制的是个Bitmap,于是交集为圆形,就实现了圆形图片效果。

而且,android Tint 也是靠 SRC_IN 来自动变成我们想要的背景颜色,来达到Material Design的效果。



作者:南腔北调集合
链接:https://www.jianshu.com/p/90a264d5c610
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Android 自定义ImageView实现圆角/圆形 附加OnTouchListener详细注释以及Button圆角 转载请注明出处:王亟亟的大牛之路平时要用一些非方方正正的按钮之类的小伙伴们是如何实现的?RadioButton?ImageButton?还是其他? 今天亟亟上的是ImageView来实现的 先上下效果图(目录结构) 分析:shape.xml用于Button的”倒角”(做过机械类的都懂,哈哈) attr.xml用于自定义ImageView的标签的定义 ids.xml用于控件findbyid用 阅读详情

相关推荐

Android实现View圆角和倒角裁剪的方法

以上就是几种常用的Android实现View圆角和倒角裁剪的方法。希望本文对你有所帮助!在Android开发中,经常需要对View进行圆角和倒角的裁剪,以实现更加美观的界面效果。本文将介绍几种常用的实现方式,并提供相应的源代码。除了使用XML和代码方式实现圆角和倒角裁剪外,还可以通过自定义View来实现。通过修改XML文件中的圆角半径,可以实现不同大小和形状的圆角和倒角裁剪效果。变量的值,可以实现不同大小和形状的圆角和倒角裁剪效果。变量的值,可以实现不同大小和形状的圆角和倒角裁剪效果。

LogicGuruX的博客 590

shape用法的详细举例

在numpy中,shape和reshape()函数的功能都是对数组或矩阵的形状进行操作。 shape函数读取矩阵或数组的长度 使用shape函数可以得出数组或矩阵的形状,得出结果是一个tuple格式的数据,之后可以使用shape[]获取其中的数据 (具体见下面的示例 ) 当数组或矩阵是一维时 import numpy as np a = np.array([1, 2, 3, 4]) a.shape a.shape[0] 输出结果 (4,) 4 shape返回的是数组的形状,是一个tuple格式的数据

weixin_46506757的博客 1万+

告别TwinCAT:手把手教你用IgH EtherCAT Master在LinuxCNC上搭建实时运动控制平台

本文详细介绍了如何利用IgH EtherCAT Master和LinuxCNC搭建开源实时运动控制平台,替代商业软件TwinCAT。通过分步指南,包括实时Linux环境配置、EtherCAT主站安装、LinuxCNC集成及多轴同步控制实现,帮助开发者构建高性能、低成本的工业自动化解决方案。

weixin_42641741的博客 401

Android Studio使用shape出现的问题

#1. shape使用 ###前段时间,在使用Android studio做UI设计时发现在使用shape或者selector的过程中会出现渲染出错问题,经过排查后才发现,在新建xml文件时,需要对文件的扩展名进行补充,补充完成后即可使用drawable进行绘制填充。

YeLiManManXing的博客 2213

【Python&RS】哨兵2号(Sentinel2)轨道条带说明+图幅统计(表格+矢量)

今天给大家带来哨兵2号的图幅编号介绍以及全国省、市所需图幅数的统计。网上教程极少,而且结果也不公开。因为每次下载的时候都不知道需要几幅,所以研究后给大家分享一下。

Remote Sensing迷途小书童 1681

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍

清洁机器人之屏幕(中,大LCD)方案--ITE 联阳986x系列 soc显控芯片介绍

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2666

ValueError: shape mismatch: objects cannot be broadcast to a single shape

在使用shape文件切割tif图的时候出的报错: 最终经过多方查找,原因是因为shape文件的边界超出了tif的边界导致报错。

qq_41240287的博客 2769

AI应用架构师实战:半导体器件仿真AI智能体系统搭建

半导体器件仿真(如MOSFET、FinFET等)是芯片设计的核心环节,传统流程依赖专家手动调参、多物理场仿真引擎(如TCAD)耗时(小时级至天级)、经验难以沉淀,导致研发周期长、成本高。如何构建一个AI智能体系统,实现仿真任务的自动化调度、参数智能优化、结果分析与知识沉淀,成为提升半导体研发效率的关键挑战。

移动开发前沿的博客 1223

attributeError: NoneType object has no attribute shape 报错

attributeError: ‘NoneType’ object has no attribute ‘shape’ 报错解决方法 之前学OpenCV时,对图片操作时,会出现attributeError: ‘NoneType’ object has no attribute ‘shape’ 报错,现将一些解决办法列出,如果有其他方法,希望大佬们可以在评论区留言。 1.将相对路径改成绝对路径。详见网站:博客园 2.改变图片放置位置,使得路径中的中文改成英文。很多导入报错,都是因为中文的原因! ...

qq_45366264的博客 1万+

YOLO26模型应用过程中的报错处理及疑问解答,涉及环境搭建、模型训练、模块改进、论文写作

本文记录了YOLO26模型的这一系列过程中可能发生的问题,以及大家非常关心的问题,这里统一做了一个记录和解答。

Limiiiing的博客 241

【DaVinci Configurator专题】-5-通过Data Mapping自动创建CAN信号关联的Port并添加到APP SWC

目录 1 导入CAN Matrix变更后的Arxml文件 2 自动创建CAN信号关联的APP Port 3 CAN信号与App SWC的接口映射/连接 4 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键词: DaVinci Developer DaVinci Configurator Pro ARXML AUTOSAR System Description Network Explorer 1

「汽车电子助手」的博客 5130

shape控制每一条边框线,每一个倒角

xml version="1.0" encoding="UTF-8"?> 顶部带圆角 白色背景 灰色边框 无下边框 长方体 --> xmlns:android="http://schemas.android.com/apk/res/android"> android:color="#FFFFFF" /> //控制每一个倒角

puyaCheer的博客 1170

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题。可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后。登录以后,选中左侧Buckets,可以看到有自己用的桶,找到以后点击打开。显示文件展示中,文件预览失败,那么这个时候,去修改minio的配置。可以看到,点击配置管理,这里我们启用的是minio对吧。默认是没有配置的这个时候,是允许下载,但不允许预览的.

添柴程序猿的专栏 5569

Android Shape工具 Duck

由于自己在开发中遇到的问题,所有弄了一个 Android Shape 的工具 Duck ,能帮助开发者直接在 xml 的任意控件上实现 Shape 效果,无需创建额外的xml文件,并且没有任何侵入性。 废话不多说,直接看效果: 项目地址:Duck 初衷 这个库的由来,是因为公司一个维护了 4 年的项目。 经历 4 年的项目,产品设计不知道改了多少版,期间产生并堆砌大量shape.xml ...

weixin_33738982的博客 242

6.6kW的车载充电器(On-Board Charger, OBC)电路分析

图片展示了6.6kW的车载充电器(On-Board Charger, OBC)电路,其中包含双向和单向两种拓扑结构。接下来我们将深入分析每个模块的设计、原理及其优势,以帮助理解不同结构在实际应用中的选型和应用。

weixin_43199439的博客 5665

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java一行代码控制shape 优雅的解决 Drawable Shape 文件繁多问题

1. 前言我们知道开发中很多图片可以用 shape 代替,但是当项目过大,功能增多,我们会发现 Drawable 文件夹下面的 .xml 文件越来越多,比如下 我们会发现,很多文件都类似,只是颜色 大小等不一样而已,所以每次碰到用到 shape 的地方还得新建 shape .xml 。这样既麻烦并且会造成 drawable .xml文件过多。 所以我希望项目中只建立几个典型常用的 shap

guozhaohui628 3769

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

android倒角按钮,Android实现圆角Button按钮

本文实例讲述了Android开发圆角Button按钮实现过程,分享给大家供大家参考,具体内容如下需求及效果图:实现思路:1、shape实现圆角在drawable新建两个xml 文件, 这两个 xml文件用shape 实现了圆角效果。Note:因为要让用户有按下去的效果体验, 所有要有两套圆角图, 在按下去时候切换android:shape="rectangle" >android:shape...

weixin_42327217的博客 516

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android画只有三个线的形状,左上右有线,底部无线,并且填充颜色,有倒角

只有三个线的边框, <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <shape> <solid android:color="#F5A623" /> </shape> <!-- Body --> <ite.

qcl111111的博客 489

Shape

shape图形的使用 <shape xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 填充色 --> <solid android:color="#ff0000ff" />   <!-- 边线 --> <stroke ...

weixin_30527423的博客 71

安卓自定义seekbar数值_android自定义seekBar

Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如ok,我们开始吧:一)变换前背景先来看看progressbar的属性:android:id="@+id/progressBar"style="?android:attr/progressBarStyleHorizontal"android:la...

weixin_36078790的博客 387

Android高效率实现弹出带动画效果的对话框,仿照微信对话框效果

转载请注明出处: http://blog.youkuaiyun.com/jakeyangchina/article/details/53423453看到很多app页面里都有弹出对话框效果,今天使用PopupWindow实现带动画效果的对话框,先看效果图:效果图:分析实现思路: 弹出对话框带有动画效果 对话框从底部向上弹出 弹出对话框时,窗体背景呈现灰色(半透明) 对话框四周具有倒角效果 接下来具体实现,首先

JakeYangChina的博客 8471

android shape生成器,打造 Material 形状主题 | 实现篇

原标题:打造 Material 形状主题 | 实现篇 作者 / Nick Rout,Material 开发技术推广工程师Material 主题(theming) 是一种自定义Material 组件的方式,目的是使其与品牌保持一致。Material 主题涉及包括颜色、排版和形状,您可以对它们进行调整来获得近乎无限的组件变体,且依然保持其核心结构和易用性。Material 主题https://mate...

weixin_39768762的博客 655

shape drawable 总结

最近比较忙,没时间总结,今天抽空总结一下drawable,一个让我很纠结的问题(xml文件中定义)。          1.bitmap drawable,这个其实只要是研究会自定义view的就会发现,其实xml文件中的各个属性,都是很熟悉的,所以就不过多解释,当然也不推荐这么使用bitmap,因为很占用内存,所以仅仅把代码贴出来,不解释。 <bitmap xmlns:android="ht

zhq217217的博客 527

android 进度条 java_Android自定义进度条

Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如ok,我们开始吧:一)变换前背景先来看看progressbar的属性:根据style="?android:attr/progressBarStyleHorizontal",我们找到源码中的style.xmlfalse@android:drawa...

weixin_35698190的博客 459
上一篇: 点击事件的过滤 和 广播接受的过滤
下一篇: 自定义有倒角的linearlayout
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值