设计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
为什么要重写getPrefferedSize()?
因为pack()这个方法,可以自动调节窗口的尺寸(前提是有布局管理器,也就是不是绝对布局)
然后pack()这个方法的原理是根据每个组件的最适尺寸来安排窗体的尺寸的,也就是每个组件的getPrefferedSize()方法
现在已经知道了getPrefferedSize()的用处了,然后我们来讲讲如果不重写getPrefferedSize()会怎么样?
原始的getPrefferedSize()方法的实现是根据Label的文本信息、图标、文本信息与图标之间的距离来安排最佳尺寸的
然而原始的文本信息是没有阴影的,所以最佳尺寸也就没有加上阴影的尺寸和字符间距
这会使得,最佳尺寸偏小,甚至右边或左边的字有一部分显示不出来(超出了组件的尺寸)
画三遍的顺序有讲究
画阴影和正文的顺序有讲究,因为画画的时候,当下一次画画的时候与上一次画画有重复的部分,那么下一次画画就会覆盖上一次的部分
所以,应该先画左右阴影(左右阴影的顺序没有讲究),最后再画正文,要确保正文不被覆盖,阴影一定要被覆盖
设计3D标签的更多相关文章
- css3实践之摩天轮式图片轮播+3D正方体+3D标签云(perspective、transform-style、perspective-origin)
本文主要通过摩天轮式图片轮播的例子来讲解与css3 3D有关的一些属性. demo预览: 摩天轮式图片轮播(貌似没兼容360 最好用chrome) 3D正方体(chrome only) 3D标签云(c ...
- SP2010 3D标签云Web部分--很酷的效果,强烈推荐!!
SP2010 3D标签云Web部分--很酷的效果.强烈推荐! ! 项目描述叙事 基于简单Flash的3D标签云Web部件.SP Server 2010使用. 建立在内置标签云Web部件 ...
- 解析3D标签云,其实很简单
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 最近开始用canvas搞3D了,搞得也是简单的东西,就是球体转圈.做出来后,突然想起以前看过的3D标签云,在以前觉得真心狂拽酷炫叼啊,当时 ...
- 3D标签
动态实现3D标签, 主要代码: // // XLMatrix.h // XLSphereView // // Created by 史晶晶 on 16/4/4. // Copyright © 2016 ...
- 十. 图形界面(GUI)设计3.标签、按钮和按钮事件
标签和按钮也许是图形界面中最常见的两种组件,按钮又总是与激发动作事件有关. 标签 标签(JLabel)是最简单的Swing组件.标签对象的作用是对位于其后的界面组件作说明.可以设置标签的属性,即前景色 ...
- jquery 3D 标签云
http://www.gbin1.com/technology/jquerynews/20111205tagcloudbyjquery/index.html 相关选项 zoom: 90 初始的缩放度 ...
- 【HMTL】3D标签球
这是一个3D TAG 在网站展示中是个不错的东东,能让人眼前一亮,值得收藏. 这个是效果: 源码下载: 点 击 下 载
- 纯JS实现的3D标签云,不依赖不论什么第三方库,支持移动页面
<span style="font-family: Arial, Helvetica, sans-serif;"><!DOCTYPE html PUBLIC &q ...
- 程序员每日一乐:html动态烟花设计 3D
3D版烟花 效果图:file:///C:/Users/QianXin/Desktop/3D%E7%83%9F%E8%8A%B1.html 经过一天的的工作或者学习是否感到枯燥乏味?现在的你是否想找些乐 ...
随机推荐
- 那些年我们写过的T-SQL(下篇)
下篇的内容很多都会在工作中用到,尤其是可编程对象,那些年我们写过的存储过程,有木有?到目前为止很多大型传统企业仍然很依赖存储过程.这部分主要难理解的部分是事务和锁机制这块,本文会进行简单的阐述.虽然很 ...
- 关于移动开发的一些想法和认识--Android和iOS
微信公众账号很久没更新了,发一点自己最近的想法和内容. 之前和朋友做了一个项目,现在在跟一些风投,大公司里面的几家在谈合作和投资的事宜,从这个过程中也了解到了一些信息. 关于移动平台的应用开发与游戏开 ...
- UML基础系列:用例图
1. 概述 用例图(Use Case Diagram)描述“用户.需求.系统功能单元”之间的关系,是参与者所能观察和使用到的系统功能模型图. 用例图用于需求分析阶段 用例图包含6个基本元素:参与者(A ...
- mongodb php
首先安装扩展,然后才能使用mongodb 一.连接数据库 try { $mongo = new MongoClient(); $db = $mongo->mydb; var_dump($db); ...
- JSP网站开发基础总结《六》
对于本篇需要总结的内容,量估计有点大,大家好好看哈,绝对全是干货,代码的已经运行测试,不存在问题,大家可以参考学习,下面开始本篇的内容. 1.添加数据到数据库: 如何用户在JSP页面的填写的信息输入到 ...
- Cwinux源码解析系列
Cwinux源码解析系列
- AngularJS的学习--ng-show/ng-hide/ng-if和ng-switch
在Angular的原生指令中有这几个指令用来控制元素的展示与否,ng-show/ng-hide/ng-if和ng-switch. 在angular性能优化中,我们也常常会用到它. 我们看下他们的区别. ...
- HTML5移动Web开发(二)——配置移动开发环境以及简单示例
一.准备 1.配置本地网络服务.对于Windows.Mac和Linux,最容易的方法是使用免费的XAMPP软件:http://www.apachefriends.org/en/index.html X ...
- web项目中,视图层中关于相对路径和绝对路径
1.在jfinal项目中 因为一直使用的jfinal,没感觉路径问题. 举个栗子,项目名字叫做test.访问一个Controller的映射为/user/add.这样,在浏览器地址栏直接:localho ...
- 【Android学习笔记】XmlResourceParser解析xml文件
最近学习Android时,需要用到解析XML文件里的数据,可以用XmlResourceParser来解析xml文件,正好将此记录下来. XmlResourceParser里常用的字段和方法 首先先给出 ...