`
noble510520
  • 浏览: 56932 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

设计3D标签

 
阅读更多

java自带的Label太枯燥了,真是拿不出手啊。
所以,我们要设计3D标签!!
看看下面这张图

原理

看看这图,可以看到哈哈有三种颜色:白色、黑色和灰色
实现的时候并不像PS那样,按几个按钮就O了
其实实际是画出3个“哈哈”,一种白色,一种黑色,一种灰色
然后想象一下,如果三种颜色的”哈哈“,重叠了起来,只留下了很小的一部分,那么就形成了阴影。
既然有三种颜色的”哈哈“,那么就需要画三次。
下面开始,我们将左上角的阴影(白色的哈哈)称为左阴影,将右下角的阴影称为由右阴影
此时阴影的位置就显得格外重要了,需要自定义左右阴影的偏移量
总所周知,对于位置的表示是坐标即横纵坐标,这时就需要设置4个偏移量——左阴影x、左阴影y、右阴影x、右阴影y
然后覆盖JLabel类中的paintComponent方法,原本这个方法只是花一次,现在我们让他画3次!!

代码实现

import java.awt.*;
import javax.swing.*;
public class ThreeDLabel extends JLabel{
    private int tracking;//这是字符空隙
    private int left_x,left_y,right_x,right_y;//四个阴影偏移量
    private Color left_color,right_color;// 左右阴影的颜色
    public ThreeDLabel(String text,int tracking){//参数为文本内容和字符空隙
        super(text);
        this.tracking=tracking;
        }
    //设置左阴影
    public void setLeftShadow(int left_x,int left_y,Color left_color){
        this.left_x=left_x;
        this.left_y=left_y;
        this.left_color=left_color;
        }
    //设置右阴影
    public void setRightShadow(int right_x,int right_y,Color right_color){
        this.right_x=right_x;
        this.right_y=right_y;
        this.right_color=right_color;
        }
    //重写getPreferredSize()方法,如果在通过setSize来设置尺寸的话,可以不覆写这个方法
    public Dimension getPreferredSize(){
        int x,y;
        FontMetrics font=this.getFontMetrics(this.getFont());
        x=(getText().length()-1)*tracking+left_x+right_x+font.stringWidth(getText());//宽=字符串所有字符空隙之和+左阴影x值+右阴影x值+字符串的宽度
        y=font.getHeight()+left_y+right_y;
        return new Dimension(x,y);
        }
        //重点!!覆写paintComponent,以达到画3次就能画出阴影效果
    public void paintComponent(Graphics g){
        //这句感觉是可有可无的,目的是让字体圆润柔和些,就像PS的饱和效果
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        char[] chars=getText().toCharArray();
        FontMetrics fm=this.getFontMetrics(getFont());
        int h=fm.getAscent();
        int x=0;
        for(char c:chars){
            int w=fm.charWidth(c)+tracking;//w=字符c的宽度+字符间隙

            //画作阴影          
            g.setColor(left_color);
            g.drawString(c+"",x-left_x,h-left_y);

            //画右阴影
            g.setColor(right_color);
            g.drawString(c+"",x+right_x,h+right_y);         

            //画正文
            g.setColor(getForeground());
            g.drawString(c+"",x,h);



            x+=w;
            }
            //这句话感觉也没什么用,目的是把anti-alising状态恢复到默认值
            ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
        }
}

下面是实例代码

class Demo{
    public static void main(String[] args){
        DIYLabel label=new DIYLabel("小柒再出发",40);
        label.setLeftShadow(2,1,Color.white);//设置左阴影属性
        label.setRightShadow(4,5,Color.gray);//设置右阴影属性
        label.setForeground(Color.black);//设置正文颜色
        label.setFont(label.getFont().deriveFont(140f));//设置字体大小为140像素
        JFrame frame=new JFrame("title");
        frame.getContentPane().add(label);
        frame.pack();//窗口自动调节大小
        frame.setVisible(true);

        }
    }

结果如图

结果

几个解释的地方

为什么要有一个字符间隙tracking?

因为:当右阴影的偏移量过大时,右阴影可能就会跑到下一个字符所在的地方,这样看起来就很难看的
上图看看有字符间隙和没有字符间隙的区别
这个图的字符间隙是0,右阴影的偏移量right_x=60,right_y=40
可以看到,前一个字的右阴影和下一个字都挤到了一起了
没有字符间隙

这张图的字符间隙为80,阴影的偏移量和上一个字一样
有了字符间隙,就可以避免前一个字的阴影和下一个字挤到了一起
所以字符间隙至少是left_x+right_x
字符间隙为80

为什么要重写getPrefferedSize()?

因为pack()这个方法,可以自动调节窗口的尺寸(前提是有布局管理器,也就是不是绝对布局)
然后pack()这个方法的原理是根据每个组件的最适尺寸来安排窗体的尺寸的,也就是每个组件的getPrefferedSize()方法
现在已经知道了getPrefferedSize()的用处了,然后我们来讲讲如果不重写getPrefferedSize()会怎么样?
原始的getPrefferedSize()方法的实现是根据Label的文本信息、图标、文本信息与图标之间的距离来安排最佳尺寸的
然而原始的文本信息是没有阴影的,所以最佳尺寸也就没有加上阴影的尺寸和字符间距
这会使得,最佳尺寸偏小,甚至右边或左边的字有一部分显示不出来(超出了组件的尺寸)

画三遍的顺序有讲究

画阴影和正文的顺序有讲究,因为画画的时候,当下一次画画的时候与上一次画画有重复的部分,那么下一次画画就会覆盖上一次的部分
所以,应该先画左右阴影(左右阴影的顺序没有讲究),最后再画正文,要确保正文不被覆盖,阴影一定要被覆盖

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    3D滚动标签云

    7. **响应式设计**:考虑到不同设备的屏幕尺寸和方向,3D标签云应具有良好的响应性。可能需要根据视口宽度调整标签的大小、间距和滚动速度。 8. **浏览器兼容性**:由于3D CSS和JavaScript动画依赖于现代浏览器的...

    3d立体旋转标签云

    接下来,我们探讨CSS在3D标签云中的应用。CSS3引入了3D变换,使得元素可以在三维空间中移动、旋转和缩放。使用`transform`属性,我们可以设置`rotateX()`, `rotateY()`, 和 `rotateZ()`函数来实现各个轴上的旋转。`...

    安卓3D标签云卡片热门相关-Android实现标签拖动改变位置.rar

    首先,3D标签云卡片的设计理念是将传统的标签以三维的方式展现,每个标签通常包含一个关键词或短语,这些标签可以以动态、立体的形式漂浮在屏幕上,形成一种云状布局。这种设计在新闻聚合、商品分类或者搜索关键词...

    3d 标签云 中英文

    "3D 标签云 中英文"项目提供了一种实现3D标签云效果的方法,尤其适合那些希望提升网页交互性和美学效果的设计者。 首先,3D标签云的核心在于其动画效果。通过JavaScript库,如Three.js这样的3D渲染框架,可以创建出...

    3d标签云源代码

    在IT行业中,标签云是一...总之,3D标签云是一种创新的数据展示方式,它结合了前端开发的先进技术与视觉设计的艺术性。通过这个源码,你可以深入探索3D图形编程,提升你的技能,并在项目中引入更多互动性和视觉吸引力。

    js 3d标签云特效

    JavaScript 3D标签云特效是一种视觉上引人入胜的网页设计技术,它将一系列关键词或标签以三维立体的方式展示,通常以旋转的球状排列,使得页面更具动态感和互动性。这种特效广泛应用于博客、新闻网站或者任何需要...

    3d标签云效果

    在网页设计中,3D标签云效果是一种独特的交互方式,它可以为用户带来视觉上的吸引力,增加网站的互动性。这种效果通常应用于展示关键词、类别标签或者导航菜单,使得信息更加直观且富有动态感。本教程将详细介绍如何...

    js3d标签云

    5. **响应式设计**:为了让3D标签云适应不同设备和屏幕尺寸,需要考虑响应式设计。这可能涉及到媒体查询(`@media`)或者根据窗口大小动态调整标签的大小和旋转速度。 6. **事件监听**:为了增加交互性,可以添加鼠标...

    3d标签效果

    本主题聚焦于使用JavaScript来实现3D标签滚动效果,这是一个常见的动态UI设计技术,能够使网页上的标签页具备立体感和动态流动感。 首先,JavaScript(简称JS)是一种轻量级的、解释型的编程语言,广泛应用于Web...

    Flex 3D标签云

    Flex 3D标签云是一种在Flex平台上创建动态、立体效果的标签展示技术,它通过将传统的二维标签转换为三维空间中的旋转元素,为用户提供了更直观、更具视觉吸引力的交互体验。这种技术常用于网站、应用程序或者数据...

    3D球形标签云效果

    3D标签云的实现涉及以下几个关键知识点: 1. **3D坐标系统**:在3D环境中,每个标签都有自己的X、Y、Z坐标,决定了它们在空间中的位置。 2. **矩阵变换**:包括平移、旋转和缩放,这些变换通过矩阵运算来实现,是...

    WordPress 3D旋转彩色标签云 3d.js文件

    JavaScript是一种客户端脚本语言,可以直接在用户的浏览器上运行,无需服务器端支持,这使得3D标签云的功能可以在任何支持JavaScript的浏览器上无缝工作。3d.js可能利用了WebGL技术,这是一种JavaScript API,允许...

    js实现3D标签云

    8. **响应式设计**:为了让3D标签云在不同设备和屏幕尺寸上都能正常显示,开发者可能还会考虑响应式设计,利用媒体查询(`media queries`)调整布局。 9. **性能优化**:对于大型标签云,可能需要考虑性能优化,如...

    超酷的js+css3实现的3D标签云特效

    【描述】:“超酷的js+css3实现的3D标签云特效”描述的是一个利用现代Web技术实现的创新设计。JavaScript作为客户端脚本语言,负责处理动画逻辑和用户交互,而CSS3则提供了强大的样式和动画功能,包括3D变换和过渡...

    js可随鼠标拖拽滚动的3D标签球

    "js可随鼠标拖拽滚动的3D标签球"是一个创新的交互设计,它将传统的标签页以3D形式呈现,并允许用户通过鼠标拖拽来滚动浏览。这个项目结合了JavaScript、3D图形编程以及ECMAScript的相关技术,为我们提供了一个独特的...

    3D标签云的js代码

    在网页设计中,3D标签云是一种创新的展示方式,它可以将传统的标签或关键词以立体、动态的形式呈现,增加用户交互体验。这种效果通常通过JavaScript(js)编程语言实现,结合CSS3技术来达到视觉上的3D效果。下面我们...

    3d标签云

    6. **响应式设计**:为了适应不同设备和屏幕尺寸,3d标签云应具有良好的响应式设计。通过媒体查询(`media queries`)和比例单位(`em`, `rem`), 可以确保标签在不同分辨率下依然保持良好布局。 7. **性能优化**:大量...

    3D球形标签云.rar

    这种设计通常由HTML、CSS和JavaScript技术构建,使得标签在视觉上形成一个球体,每个标签如同星球上的卫星,围绕中心点旋转,提供了一种独特的方式来展示大量的分类信息。 HTML(HyperText Markup Language)是网页...

    Html+css+JavaScript实现的3D球面标签云效果

    在网页设计中,3D球面标签云是一种创新且引人注目的视觉表现形式,它将传统的二维标签云提升到了一个新的维度。...接下来,我们将深入探讨如何利用...在实践中,不断调整和优化,就能实现一个既美观又实用的3D标签云效果。

    炫的3D标签云的效果,类似于各种播放器首页的字体悬浮效果

    标题中的“炫的3D标签云的效果”指的是在软件或应用设计中,使用3D视觉效果展示标签的方式,这些标签通常以文字形式呈现,如同云朵般漂浮并具有动态变化,常见于各种媒体播放器的首页。这种设计能够吸引用户注意力,...

Global site tag (gtag.js) - Google Analytics