精华内容
下载资源
问答
  • QT 完美实现圆形按钮

    2020-12-30 13:22:40
    QT 版本:5.6.0官方的按钮有些普通,如果我们想要换成自己喜欢的按钮而却无从下手,那么请继续往下阅读(皮一下)。首先,可以在网络上搜索一下自己喜欢的按钮图形(或者可以自行绘制),我以下面的图形为例:开始制作:...

    QT 版本:5.6.0

    官方的按钮有些普通,如果我们想要换成自己喜欢的按钮而却无从下手,那么请继续往下阅读(皮一下)。

    首先,可以在网络上搜索一下自己喜欢的按钮图形(或者可以自行绘制),我以下面的图形为例:

    开始制作:

    一、建立 QT 工程,并加入图形资源

    创建好工程,向工程中加入资源文件:

    在资源文件中加入两个按钮图片,一个用于正常显示,一个用于鼠标停留的时候显示:

    二、构造 MyButton 类

    该类继承自 QPushButton

    借助 enterEvent 与 leaveEvent 实现按钮的动态变化。

    mybutton.h 文件内容:

    #ifndef MYBUTTON_H

    #define MYBUTTON_H

    #include

    #include

    class MyButton : public QPushButton

    {

    Q_OBJECT

    public:

    MyButton(QWidget *);

    protected:

    virtual void enterEvent(QEvent *);

    virtual void leaveEvent(QEvent *);

    };

    #endif // MYBUTTON_H

    三、实现 MyButton 类的各个接口

    mybutton.cpp 文件内容:

    #include "mybutton.h"

    #include "ui_widget.h"

    #include

    #include

    MyButton::MyButton(QWidget *parent):

    QPushButton(parent)

    {

    QPixmap pixmap(":/init.png");

    resize(pixmap.size());

    /* 设置按钮的有效区域 */

    setMask(QBitmap(pixmap.mask()));

    setStyleSheet("QPushButton{border-image: url(:/init.png);}");

    }

    void MyButton::enterEvent(QEvent *)

    {

    setStyleSheet("QPushButton{border-image: url(:/click.png);}");

    }

    void MyButton::leaveEvent(QEvent *)

    {

    setStyleSheet("QPushButton{border-image: url(:/init.png);}");

    }

    引入 QPixmap 的原因:借助 pixmap 实现按钮的 setMask 接口,该功能是禁止掉图形外的区域点击有效。

    四、创建 MyButton

    Widget.cpp 文件中加入:

    Widget::Widget(QWidget *parent) :

    QWidget(parent),

    ui(new Ui::Widget)

    {

    ui->setupUi(this);

    new MyButton(this);

    this->setWindowFlags(Qt::FramelessWindowHint);

    }

    运行效果:

    初始按钮状态:

    鼠标放上后状态:

    后期补充:

    设置屏蔽区域方法一:

    QPixmap pixmap(":/init.png");

    /* 设置按钮的有效区域 */

    setMask(QBitmap(pixmap.mask()));

    设置屏蔽区域方法二:

    /* 半径为 35 的圆形按钮 */

    setMask(QRegion(0,0,70,70,QRegion::Ellipse));

    展开全文
  • 重写OnPopulateMesh方法,创建圆形图片的网格(UGUI控件的本质是网格,这点可参考之前的博客《Unity3D UGUI系列之合批》) 实现ICanvasRaycastFilter接口,用来过滤掉圆形区域外的点击 3 项目 项目链接:...


    1 效果展示

    只在圆形区域内点击有效。
    圆形按钮

    2 分析

    • 参照UGUI源码中的Image,创建一个子类继承自MaskableGraphic
    • 重写OnPopulateMesh方法,创建圆形图片的网格(UGUI控件的本质是网格,这点可参考之前的博客《Unity3D UGUI系列之合批》)
    • 实现ICanvasRaycastFilter接口,用来过滤掉圆形区域外的点击

    3 项目

    项目链接:https://pan.baidu.com/s/1VBHjsIrlTInb8QxdE2phcA
    提取码:dn3p
    博主个人博客本文链接。
    BaseImage.cs

    using System;
    using UnityEngine;
    using UnityEngine.Serialization;
    using UnityEngine.UI;
    
    namespace CustomUI
    {
        public class BaseImage : MaskableGraphic, ISerializationCallbackReceiver, ILayoutElement, ICanvasRaycastFilter
        {
            [FormerlySerializedAs("m_Frame")]
            [SerializeField]
            private Sprite m_Sprite;
            public Sprite sprite { get { return m_Sprite; } set { if (SetPropertyUtility.SetClass(ref m_Sprite, value)) SetAllDirty(); } }
    
            [NonSerialized]
            private Sprite m_OverrideSprite;
            public Sprite overrideSprite { get { return m_OverrideSprite == null ? sprite : m_OverrideSprite; } set { if (SetPropertyUtility.SetClass(ref m_OverrideSprite, value)) SetAllDirty(); } }
    
            public override Texture mainTexture
            {
                get
                {
                    return overrideSprite == null ? s_WhiteTexture : overrideSprite.texture;
                }
            }
    
            public float pixelsPerUnit
            {
                get
                {
                    float spritePixelsPerUnit = 100;
                    if (sprite)
                        spritePixelsPerUnit = sprite.pixelsPerUnit;
    
                    float referencePixelsPerUnit = 100;
                    if (canvas)
                        referencePixelsPerUnit = canvas.referencePixelsPerUnit;
    
                    return spritePixelsPerUnit / referencePixelsPerUnit;
                }
            }
    
            protected override void OnPopulateMesh(VertexHelper vh)
            {
                base.OnPopulateMesh(vh);
            }
    
            #region ISerializationCallbackReceiver
            public void OnAfterDeserialize()
            {
            }
    
            //     Implement this method to receive a callback after unity serialized your object.
            public void OnBeforeSerialize()
            {
            }
            #endregion
    
            #region ILayoutElement
            public virtual void CalculateLayoutInputHorizontal() { }
            public virtual void CalculateLayoutInputVertical() { }
    
            public virtual float minWidth { get { return 0; } }
    
            public virtual float preferredWidth
            {
                get
                {
                    if (overrideSprite == null)
                        return 0;
                    return overrideSprite.rect.size.x / pixelsPerUnit;
                }
            }
    
            public virtual float flexibleWidth { get { return -1; } }
    
            public virtual float minHeight { get { return 0; } }
    
            public virtual float preferredHeight
            {
                get
                {
                    if (overrideSprite == null)
                        return 0;
                    return overrideSprite.rect.size.y / pixelsPerUnit;
                }
            }
    
            public virtual float flexibleHeight { get { return -1; } }
    
            public virtual int layoutPriority { get { return 0; } }
            #endregion
    
            #region ICanvasRaycastFilter
            public virtual bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
            {
                return true;
            }
            #endregion
    
        }
    }
    
    

    SetPropertyUtility.cs

    using UnityEngine;
    
    namespace CustomUI
    {
        public static class SetPropertyUtility
        {
            public static bool SetColor(ref Color currentValue, Color newValue)
            {
                if (currentValue.r == newValue.r && currentValue.g == newValue.g && currentValue.b == newValue.b && currentValue.a == newValue.a)
                    return false;
    
                currentValue = newValue;
                return true;
            }
    
            public static bool SetStruct<T>(ref T currentValue, T newValue) where T : struct
            {
                if (currentValue.Equals(newValue))
                    return false;
    
                currentValue = newValue;
                return true;
            }
    
            public static bool SetClass<T>(ref T currentValue, T newValue) where T : class
            {
                if ((currentValue == null && newValue == null) || (currentValue != null && currentValue.Equals(newValue)))
                    return false;
    
                currentValue = newValue;
                return true;
            }
        }
    }
    
    

    CircularImage.cs

    using UnityEngine;
    using UnityEngine.Sprites;
    using UnityEngine.UI;
    
    namespace CustomUI
    {
        // 圆形按钮
        public class CircularImage : BaseImage
        {
            [SerializeField] public float radius = 50;                    // 半径
            [Range(3, 100)]
            [SerializeField] public int segment = 20;                     // 分段数
            
            public override bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
            {
                RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, sp, eventCamera,
                    out Vector2 localPos);
                float dis = Vector3.Distance(localPos, Vector3.zero);
                return dis <= radius;
            }
    
            protected override void OnPopulateMesh(VertexHelper vh)
            {
                Color32 color32 = color;
                vh.Clear();
    
                float deltaRad = 2 * Mathf.PI / segment;
                Vector3 center = Vector3.zero;
    
                float tw = rectTransform.rect.width;
                float th = rectTransform.rect.height;
    
                Vector4 uv = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;
    
                float uvCenterX = (uv.x + uv.z) * 0.5f;
                float uvCenterY = (uv.y + uv.w) * 0.5f;
                float uvScaleX = (uv.z - uv.x) / tw;
                float uvScaleY = (uv.w - uv.y) / th;
    
                // 顶点是以pivot为参考的
                for (int i = 0; i < segment; i++)
                {
                    float rad = deltaRad * i;
                    float sin = Mathf.Sin(rad);
                    float cos = Mathf.Cos(rad);
                    float x = radius * sin;
                    float y = radius * cos;
                    vh.AddVert(new Vector3(x, y), color32, new Vector2(x * uvScaleX + uvCenterX, y * uvScaleY + uvCenterY));
                }
                vh.AddVert(center, color32, new Vector2(uvCenterX, uvCenterY));
    
                for (int i = 0; i < segment; i++)
                {
                    if (i == segment - 1)
                    {
                        vh.AddTriangle(i, 0, segment);
                    }
                    else
                    {
                        vh.AddTriangle(i, i+1, segment);
                    }
                }
            }
        }
    }
    
    

    4 参考文章

    展开全文
  • 安卓 设置圆角按钮

    2021-12-08 10:50:19
    btn_shap.xml <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android=... android:shape="rectangle">...solid android:color="@color/color_sky_blue" />....

    btn_shap.xml 

    <?xml version="1.0" encoding="UTF-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <!-- 填充的颜色 -->
        <solid android:color="@color/color_sky_blue" />
        <!-- 设置按钮的四个角为弧形 -->
        <!-- android:radius 弧形的半径 -->
        <corners android:radius="7dip" />
    <!--
        &lt;!&ndash; padding:Button里面的文字与Button边界的间隔 &ndash;&gt;
        <padding
            android:bottom="10dp"
            android:left="10dp"
            android:right="10dp"
            android:top="10dp" />-->
    </shape>

    展开全文
  • 简单的设置圆形按钮

    2021-03-15 19:13:26
    /** * 圆形头像 * * @param bitmap * @param ratio * 按照截取比例来获取圆形图片 * @return */ public Bitmap getRoundedCornerBitmap(Bitmap bitmap) { if (bitmap == null) { bitmap = BitmapFactory....

    开始的时候,我们先将控件实例化出来,然后将它设置一个图片给它:(记住是bitmap型的)

    img = (ImageView) findViewById(R.id.imgHead);

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),

    R.drawable.header1);

    Bitmap output = getRoundedCornerBitmap(bitmap);

    img.setImageBitmap(output);

    以上的代码是设置我的头像为圆形的,以前找了好久,才知道,一句代码就ok啦!好吧,我

    又想错了,其实还是需要很多的代码,这里还需要一个方法,里面才是实现圆形的核心代码。

    /**

    * 圆形头像

    *

    * @param bitmap

    * @param ratio

    * 按照截取比例来获取圆形图片

    * @return

    */

    public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {

    if (bitmap == null) {

    bitmap = BitmapFactory.decodeResource(getResources(),

    R.drawable.gui);

    }

    Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(),

    bitmap.getHeight(), Config.ARGB_8888);

    Canvas canvas = new Canvas(outBitmap);

    final int color = 0xff424242;

    final Paint paint = new Paint();

    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());

    final RectF rectF = new RectF(rect);

    final float roundPX = bitmap.getWidth() / 2 < bitmap.getHeight() / 2 ? bitmap

    .getWidth() : bitmap.getHeight();

    paint.setAntiAlias(true);

    canvas.drawARGB(0, 0, 0, 0);

    paint.setColor(color);

    canvas.drawRoundRect(rectF, roundPX, roundPX, paint);

    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));

    canvas.drawBitmap(bitmap, rect, rect, paint);

    return outBitmap;

    }

    以上这些代码才可以使得一个图形化控件成为一个圆形

    展开全文
  • CSS美化的按钮var btn = {init : function() {if (!document.getElementById || !document.createElement || !document.appendChild) return false;as = btn.getElementsByClassName('btn(.*)');for (i=0; iif ( as...
  •  虚幻引擎:UMG原生圆角按钮,CSS级别动效和按钮圆角,UE4自适应圆角UI,UE4高级自定义按钮,UE4高级自定义Widget组件_哔哩哔哩_bilibili模块化制作,快速应用上线UE4原生UMG实现CSS效果级别自定义按钮组件我们的...
  • 无法在这个位置找到: /templets/default/think201610/bodys.htmdiv css不同大小尺寸圆角案例,css不同颜色的圆角按钮资源代码,可用于div圆角按钮效果、input圆角按钮、button圆角按钮、a超链接圆角按钮效果样式...
  • 效果 材质制作 如何使用 创建材质实例在UI的Border中加载即可。
  • Java制作圆形按钮

    2021-03-01 07:42:00
    这是一个关于制作圆形Swing按钮的技巧。事实上,这个技巧中的知识方便的适用于任何形状的按钮,但我们只作一个圆形按钮。当你制作一个圆形按钮时,需要做两件事。第一件事是重载一个适当的绘画方法以画出一个...
  • 本打算自己写一个,LIO的博客写的很清楚,就直接转载了按钮图片自适应宽度圆角按钮实现原理通过背景的左对齐和右对齐用A标签和span标签组合出一个完整的圆角矩形。再通过hover标签去滑动图 片。CSS:a{background:url...
  • 使用Box Shadow:一种方法是在伪元素上使用box-shadow,如下面的代码片段所示.这里,一个伪元素(.shape:before)的位置使得它稍微高于圆圈的右上角,然后它的框阴影用于填充具有所需背景的父元素(.container)颜色....
  • css3制作圆角按钮

    2021-06-09 02:58:21
    html5中button怎么把边框怎么弄成圆角?在HTML中把块的边框做成圆角需要利用css的border-radius属性。 操作步骤:打开Adobe ...html5中button怎么边框怎么弄成圆角怎么实现按钮圆角弧度显示用CSS代码设定...
  • Android圆角按钮

    2021-03-01 07:09:44
    1、用xml文件实现圆角a、在drawable文件夹下新建shape.xml文件,内如如下:xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle">b、再新建一个shape_press.xmlxmlns:android=...
  • Qt如何实现圆形按钮

    2021-05-19 19:22:01
    通过圆形位图设置 通过border-radius设置 Qt如何实现圆形按钮 Qt实现圆形按钮的几种方式
  • 如何制作圆形按钮

    2021-03-09 07:13:28
    并使用 transparent 背景制作圆形图像 2 years ago 对于圆形按钮创建一个形状: android:width="8dp" android:color="#FFFFFF" /> android:bottomLeftRadius="45dp" android:bottomRightRadius="45dp" android:...
  • HTML5/CSS3 3D立体功能按钮在线演示.screen-reader-text {position: absolute;top: -9999px;left: -9999px;}@font-face {font-family: 'fontello';src: url('...
  • 使用滑动门技术实现圆角按钮,如图所示,背景图和效果图。所谓滑动门,就是当按钮的状态改变时,移动背景图,显示不同的状态。此法简单有效,但缺点是不能纵向扩展。要处理纵向扩展,就要使用复杂的圆解技术,如4个...
  • 我想绘制一个完美的圆形按钮.我尝试使用以下代码:android:shape="oval" >android:width="3dip"android:color="#065a32" />但即使我更改参数,我也只能绘制椭圆形状:android:width="3dip"/>我的截图:我...
  • Android 实现圆形按钮

    千次阅读 2021-11-13 20:29:51
    在Android studio中,我们可以通过设置Button的radius属性来修改按钮圆角,但是美观程度因人而异,所以我们今天使用ImageButton按钮来实现圆形按钮。 代码实现效果图: 代码实现 layout的.xml代码如下: <...
  • 笔者的思路是,将按钮的背景色和阴影去除,在其外包裹Container,设置外层容器的圆角和背景色即可。 代码 Container( width: 340, height: 49, //在此设置 decoration: BoxDecoration( borderRadius: ...
  • CSS语言:CSSSCSS确定body {height: 100vh;width: 100vw;margin: 0;}#body {-webkit-box-orient: vertical;-webkit-box-direction: normal;-webkit-flex-direction: column;-ms-flex-direction: column;...
  • 我在这里有几种思路,简单的说一下1、使用圆形的背景图片,通过它实现按钮圆形2、自定义按钮,重新绘制实现按钮圆形3、使用shape中oval类型作为背景实现按钮圆形相比较来说方法1最简单、方法2最复杂、方法3比方法1...
  • java 圆形按钮

    2021-02-12 11:39:13
    * 第二件事是设置一些事件使得只有当你点击圆形按钮的范围中的时侯按钮才会作出响应 */ public class CircleButton extends JButton { public CircleButton(String label) { super(label); // 获取按钮的最佳大小 ...
  • Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。Swing提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。它们是JFC的一部分。它们支持可...
  • 本文实例为大家分享了Android制作圆角按钮的具体代码,供大家参考,具体内容如下【主要步骤】创建一个XML文件以此文件作为Button的Background1.创建XML文件在res目录下的drawable-mdpi下建立XML文件button_frame_...
  • java swing 圆形按钮

    2021-03-14 11:53:26
    import java.awt.*;import java.awt.geom.*;import javax.swing.*;class RButton extends JButton {public RButton...// 这些声明把按钮扩展为一个圆而不是一个椭圆。Dimension size = getPreferredSize();size...
  • 我能够使用CSS制作圆角按钮。我希望能够鼠标悬停按钮,整个事物改变它的颜色,而不仅仅是最内在的div。请帮助!我的假设是,我应该有一些与onmouseover =“”的javascript,对吗?这是页面:...
  • HTML5/CSS3 3D立体功能按钮在线演示.screen-reader-text {position: absolute;top: -9999px;left: -9999px;}@font-face {font-family: 'fontello';src: url('...
  • 在程序开发中,经常用到Button,而且经常用到各种形状Button,这次教程就讲个比较简单圆形按钮圆形按钮有很多种实现方式,例如第一种方式在样式中用Ellipse画一个圆形,宽度和高度一致。第二种方式用Border设置...
  • div+CSS3实现制作精美漂亮的圆角按钮特效代码</title> <style type="text/css"> .demo{width:760px; margin:20px auto 0 auto; height:70px;} .button { display: inline-block; ou.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 88,348
精华内容 35,339
关键字:

圆形按钮

友情链接: LabView004.rar