×

gridbagconstraints s

java网格包布局管理器的GridBagConstraints类型的约束参数:?哪位大侠可以给我讲下google那个图片特效的原理

admin admin 发表于2022-04-28 03:29:46 浏览177 评论0

抢沙发发表评论

java网格包布局管理器的GridBagConstraints类型的约束参数:

double weightx和double weighty参数(默认值为0)这是两个非常重要的参数,该参数直接影响到怎样设置网格单元的大小,因此常握好该参数就可以对网格包布局应用自如。该参数对x方向和y方向指定一个加权值。这个加权值直接影响到网格单元的大小,比如weightx的值分别为10,20,30,则在容器的x方向也就是列的方向,按一定的比例(比如1:2:3其具体算法请参看java文件)分配三个网格单元,其中加权值越大网格单元就越大,可以看出值的大小是没有关系的,加权值的作用是让容器以设定的值的比例在横向和纵向分配网格,且在容器的大小改变时这个比例不改变。如果weightx只设置了一个值,而组件却不只一个以上,则被设置了的这个组件的网格单元的大小为容器在x方向的大小减去那两个组件的最小尺寸就是该组件的网格单元大小。默认情况下组件的最小尺寸是比较小的。如果两个参数都为0(默认值),则组件会被显示在容器的中央,不管容器是放大还是缩小组件都只会显示在容器的中央。由上所述,在使用网格包布局时首先应先使用weightx和weighty来划分网格单元(不是直接划分,而是按一定比例来划分),网格单元划分出来后,组件放置在网格单元中的位置和大小就由后面介绍的约束来决定。一定要注意的是设置权值后要使当前的设置生效应使用setConstraints()函数一次,如果连续设置多个同一方向的权值,则只有最后一次设置的权值有效,比如出现同时两行都设置了x方向的权值,则以最后一行设置的x方向的权值为标准来划分网格单元。因此在使用GridBagLayout网格包布局管理器之前应先设置好网格单元,即要把容器划分为几行几列的网格单元,每行每列在容器中的宽度和高度比例,每个组件应在哪个网格单元。int fill参数(默认值为GridBagConstraints.NONE)fill参数指定组件填充网格的方式,当某组件的网格单元大于组件的大小时被使用,一般情况下组件是以最小的方式被显示的,如果不使用fill参数,则有可能组件占不完整个网格单元,也就是说组件占据的空间比划分的网格单元小,这时组件将显示在网格单元中的某个位置(具体在什么位置由网格包中的参数来设置)。其可取的值如下:GridBagConstraints.NONE默认值,不改变组件的大小。GridBagConstraints.HORIZONTAL使组件足够大,以填充其网格单元的水平方向,但不改变高度,其值等于整数2。GridBagConstraints.VERTICAL使组件足够大,以填充其网格单元的垂直方向,但不改变宽度,其值等于整数3。GridBagConstraints.BOTH使组件足够大,以填充其整个网格单元,其值等于整数1。int gridwidth和int gridheight参数(默认值为1)该参数指定组件占据多少个网格单元,gridwidth指定组件占据多少个网格单元的宽度,gridheight指定组件占据多少个网格单元的高度。两个参数的默认值都为1。其中值GridBagConstraints.REMAINDER表示当前组件在其行或列上为最后一个组件,也就是说如果是行上的最后一个组件的话,那么下一个组件将会被添加到容器中的下一行,如果在行上不指定该值(同时也不指定gridx和gridy参数),那么无论添加多少个组件都是在同一行上,同样如果在列上不指定该值(同时也不指定gridx和gridy参数)则无论添加多少行组件,都无法把容器填满。值GridBagConstraints.RELATIVE表示当前组件在其行或列上为倒数第二个组件。示例:import java.awt.*;public class Program{public static void main(String args){ Frame ff = new Frame();GridBagLayout gr = new GridBagLayout();GridBagConstraints gc = new GridBagConstraints(); //创建一个名为gc的约束对象ff.setLayout(gr); //将容器ff的布局设为GridBagLayout//创建一组按钮组件Button bb1 = new Button(bb1); Button bb2 = new Button(bb2); Button bb3 = new Button(bb3);Button bb4 = new Button(bb4); Button bb5 = new Button(bb5); Button bb6 = new Button(bb6);Button bb7 = new Button(bb7); Button bb8 = new Button(bb8);gc.fill = GridBagConstraints.BOTH;//设置约束的fill参数,该参数表示当组件的大小小于网格单元的大小时在水平和垂直方向都填充,gc.weightx =11; //设置x方向的加权值为11。gc.weighty = 11;//设置y方向的加权值为11。gr.setConstraints(bb1, gc); //将以上gc所设置的约束应用到按钮组件bb1gc.weightx = 22;//设置x方向的加权值为22,如果不设置weightx则以下的组件都将自动应用上面所设置的weightx值11。gr.setConstraints(bb2, gc); //将以上所设置的约束应用到按钮组件bb2。//gc.weighty=111; //注意如果不注释掉该行,则以后使用gc约束的按钮组件在y方向的加权值将为111,而在前面设置的y方向的加权值11将失去作用。gc.weightx =33;gc.gridwidth = GridBagConstraints.REMAINDER;//设置gridwidth参数的值为REMAINDER这样在后面使用该约束的组件将是该行的最后一个组件。gr.setConstraints(bb3, gc); //第一行添加了三个按钮组件bb1,bb2,bb3,且这3个按钮的宽度按weightx设置的值11,22,33按比例设置宽度GridBagConstraints gc1 = new GridBagConstraints();//创建第二个约束gc1gc1.fill = GridBagConstraints.BOTH;gc1.weighty = 22; //将第2行的y方向加权值设为22gr.setConstraints(bb4, gc1);gr.setConstraints(bb5, gc1);gc1.gridwidth = GridBagConstraints.REMAINDER;gr.setConstraints(bb6, gc1); //第二行添加了三个按钮组件bb4,bb5,bb6gc1.weighty =33;gc1.gridwidth = GridBagConstraints.REMAINDER;gr.setConstraints(bb7, gc1);//第三行添加了一个按钮组件bb7gc1.weighty=0;gr.setConstraints(bb8, gc1); //第四行添加了一个按钮组件bb8,bb8并没有添加到bb7的后面,因为bb8使用了bb7前面的gridwidth参数设置的值,所以bb8也是单独的一行。ff.setSize(500, 300);ff.add(bb1); ff.add(bb2);ff.add(bb3); ff.add(bb4); ff.add(bb5); ff.add(bb6); ff.add(bb7); ff.add(bb8);ff.setVisible(true);} }运行结果见下图int gridx和int gridy参数(默认值为GridBagConstraints.RELATIVE)该参数表示组件被添加到容器中的X或者Y坐标处,坐标以网格单元为单位,也就是说不管网格单元有多大,一个网格单元就是1X1的大小,也就是说如果把gridx和gridy都设为1,那么该组件会被显示到第二行的行二列上。其中值GridBagConstraints.RELATIVE(默认值)表示当前组件紧跟在上一个组件的后面。int ipadx和int ipady参数(默认值为0)ipadx和ipady也被称为内部填充,该参数用以设置组件的最小尺寸,如果参数值为正值则组件的最小尺寸将比原始最小尺寸大,如果为负值,则组件的最小尺寸将会变得比原始的最小尺寸小。该参数也可以理解为直接为组件指定大小,这个设置的大小就是组件的最小尺寸。其设置后组件的大小为组件的原始最小尺寸加上ipadx*2个像素。int anchor参数(默认值为GridBagConstraints.CENTER)该参数指定当组件的大小小于网格单元时,组件在网格单元中的位置。一般情况下,在设置了weightx或者weighty的加权值时,如果不使用fill参数填充空白区域,则组件的大小将小于网格单元的大小,这时使用anchor参数就能看到其中的效果了。anchor参数可取的值有:GridBagConstraints.CENTER;GridBagConstraints.NORTH;GridBagConstraints.NORTHEAST;GridBagConstraints.EAST;GridBagConstraints.SOUTHEAST;GridBagConstraints.SOUTH;GridBagConstraints.SOUTHWEST;GridBagConstraints.WEST;GridBagConstraints.NORTHWEST;即居中,北,东北,东,东南,南,西南,西,西北方向。Insets insets参数(默认值为0)insets参数也被称为外部填充,该参数指定组件与网格单元之间的最小空白区域大小,要注意的是即使使用了fill参数填充横向和纵向但只要设置了insets参数,同样会留出insets所设置的空白区域,在insets设置的空白区域不会被填充。在使用该参数时需要设置对象的top,left,right,bottom四个方向的值来调整组件与网格单元之间的空白区域大小,比如gc.insets=new Insets(10,10,10,10);其中gc是GridBagConstraints类型的约束对象,这里要注意后面的new Insets其中的Insets第一个字母是大写的。当然也可以为insets指定负值,以扩大其网格单元。示例:import java.awt.*;public class Program{public static void main(String args){//将容器ff的布局设为GridBagLayoutFrame ff = new Frame();GridBagLayout gr = new GridBagLayout();GridBagConstraints gc = new GridBagConstraints(); //创建一个名为gc的约束对象ff.setLayout(gr);//创建一组按钮组件Button bb1 = new Button(bb1); Button bb2 = new Button(bb2); Button bb3 = new Button(bb3);Button bb4 = new Button(bb4); Button bb5 = new Button(bb5); Button bb6 = new Button(bb6);Button bb7 = new Button(bb7); Button bb8 = new Button(bb8);gc.fill = GridBagConstraints.BOTH;gc.weightx = 11; gc.weighty = 11;gr.setConstraints(bb1, gc);gc.weightx = 22;gc.gridx = 1; gc.gridy = 1; //将下一个组件放置在坐标为1,1的位置。gr.setConstraints(bb2, gc);gc.weightx = 33;gc.gridx = 2; gc.gridy = 1; //将下一个组件放置在坐标为2,1的位置。gc.insets = new Insets(-10, -10, -10, -10); //将下一个组件与网格单元的空白区域向外扩展10个像素,在这里可以看到网格包布局允许组件之间重叠。gc.gridwidth = GridBagConstraints.REMAINDER;gr.setConstraints(bb3, gc);GridBagConstraints gc1 = new GridBagConstraints();gc1.weighty = 22;gc1.ipadx = 50; gc1.ipady = 50; //将组件的最小尺寸加大ipadx*2个像素。gr.setConstraints(bb4, gc1);gc1.ipadx = 0;gc1.ipady = 0; //将以后的组件的最小尺寸设置为默认值,如果省掉该行,则以后组件的最小尺寸都会加大ipadx*2个像素。gc1.anchor = GridBagConstraints.NORTHWEST; //将下一个组件bb5的位置放置在单元网格的西北方向。gr.setConstraints(bb5, gc1); //因为bb5未设置fill,同时bb5设置了weightx(由gc参数设置)和weighty两个值以确定bb5所在的网格单元的大小,因而组件bb5的原始最小尺寸无法占据整个网格单元。gc1.fill = GridBagConstraints.BOTH;gc1.gridwidth = GridBagConstraints.REMAINDER;gr.setConstraints(bb6, gc1);gc1.weighty = 33;gc1.insets = new Insets(5, 15,40,150); //使下一个组件bb7与网格单元之间在上,左,下,右,分别保持5,15,40,150个像素的空白位置。gr.setConstraints(bb7, gc1);gc1.weighty = 0;gc1.insets = new Insets(0, 0, 0, 0); //将insets的参数值设为默认值。gr.setConstraints(bb8, gc1);ff.setSize(500, 300);ff.add(bb1); ff.add(bb2); ff.add(bb3); ff.add(bb4); ff.add(bb5); ff.add(bb6); ff.add(bb7); ff.add(bb8);ff.setVisible(true);}}

哪位大侠可以给我讲下google那个图片特效的原理

这个很简单,我告诉你正解 这里面用到的技术:ajax,div层的概念,javascript的第三方特效库 div层的概念:类似于一个容器,能够容纳图片等。用代码来解释就是:“《div》这里存放图片《/div》” 略缩图和大图:图像可以用代码来控制显示的大小,所以你能够看到小图和大图 当你点击略缩图示,你最先看到一块白色区域,中间的地方有个加载等待图案,这里面用到了ajax技术,同时用到了div层的概念(稍候解释)。当ajax接收到了图片加载完毕的信息后,会告知浏览器,可以显示图片了。 第二步,图片显示在白色区域中。 为什么有些时候白色区域会变小? 因为这里又用到了第三方的js函数库,他的作用的过渡效果,即div层的移动。所以你会看到白色区域慢慢的向图片边缘靠拢。 问什么你点击不到其他地方? 用技术的角度来解释,就是在你第一次点击小图的时候,他已经自动创建的一个透明的div层在上面,所以你点不到他 这就类似于你在桌子上放一幅画,而在画的上面放上玻璃板,当你用笔去往上写东西的时候,当然不会写到画上面。 我说,大哥,你明白了吗?我解释的不容易啊,给分吧 ******************************************** 我是搞web开发的,如果用我们的专业术语来给你解释,你能明白吗?你有什么依据来证实你说的是对的?代码的编译原理,程序执行的先后顺序,我能够用我的经验判断出来。如果你想真正弄清楚这是怎么一回事,我希望你看看javascript和html基本语法知识(特别是div的用法,设置他的style的z-index属性和filter属性,然后就是js的基本语法和dom规范),然后再来提问。这样效果会好一些,前提是你愿意在这上面花费一些时间 ********************************************* 页面确实有flash控件,但只有一个地方用到了,而图片显示的时候没有用到。共两个文件如下(webroot代表应用根目录) 名称:flash_ad_relay.swf 目录:webroot/comic/flasher/ads_data/ 名称:imgad.swf 目录:webroot/comic/flasher/ads_data/ 说明:通过观察ads.htm(目录在webroot/comic/flasher/)文件代码,能够判断,flash_ad_relay.swf应该是google提供的一个flash控件,其作用是控制广告程序的加载进度。而imgad.swf则是一个广告(ad)程序,当当网的那个,在页面最下面。 总体来说flash_ad_relay.swf用来控制imgad.swf文件加载的进度并且显示。 入口方法:tianchaoyu.html文件中《script type=“text/javascript“ src=“《/script》 此行代码用来加载flash广告程序,这应该是遵循了google的命名规范和目录结构。 上面这个是我个人推测的,但只有这一个地方用到flash文件,图片显示完全没有用到。 ********************************************** lightbox.css文件 目录:说明:#outerImageContainer{ position: relative; background-color: #fff; width: 250px; height: 250px; margin: 0 auto; } 上面为lightbox.css代码片断,width: 250px;height: 250px;控制了图片第一次点击的时候初始化大小为250像素*250像素 在17寸1024*768分辨率上。加载的过程中用到了loading.gif图片( 当点击图片,图片数据传输完毕之后,能够获得图片的宽高属性,根据这些属性,那个div层(《div》《img /》《/div》)会自动扩大或缩小,以适应新的图片。这就是你看到的过渡效果。 处理放大缩小过渡效果的文件是lightbox.js,而effects.js也有一些坐标变化的处理。 lightbox.js是一个简单实用的用来把图片覆盖在当前页面上的脚本. 它能被快速安装并且运作于所有流行的浏览器.。这个网站上用的是2.02版本,它是由Lokesh Dhakar人于20060331日创建的,可以通过 最后介绍使用方法,非常easy ********************************************** 先说一下其他两个js框架 prototype.js 它是一个非常优雅的javascript基础类库,对javascript做了大量的扩展,而且很好的支持Ajax,国外有多个基于此类库实现的效果库,也做得很棒。 像前面提到的lightbox.js和后面要说的effects.js是基于prototype.js实现的,他们通常结合使用。 scriptaculous.js和effects.js 这是个动画效果库。 scriptaculous 包含以下几个部分: builder.js :提供了一种方便的建立html元素的方法 controls.js :包含自动提示和动态编辑两个控件 dragdrop.js : 提供元素拖放的功能 effects.js : 设计优良的ajax效果库,这篇文章要讲的就是这个 slider.js : 一个滑动条控件 effects.js中提供了两种类型的动画效果,一种称为核心效果(core effect),一种称为组合效果(combination effect) ********************************************** 结合使用 第一步 Lightbox v2.0 使用 Prototype 框架和 Scriptaculous 效果库. 你将需要外调这三个 Javascript 文件在你的 header. 代码: 《script type=“text/javascript“ src=“js/prototype.js“》《/script》 《script type=“text/javascript“ src=“js/scriptaculous.js?load=effects“》《/script》 《script type=“text/javascript“ src=“js/lightbox.js“》《/script》 第二步 外调 Lightbox CSS 文件 (或添加 Lightbox 样式到你现行的样式表中). 《link rel=“stylesheet“ href=“css/lightbox.css“ type=“text/css“ media=“screen“ /》 第三步 检查 CSS 并确定调用的 prev.gif 和 next.gif 文件在正确的位置. 同样要确定调用的 loading.gif 和 close.gif 文件及 lightbox.js 文件在正确的位置. 方式一:添加 rel=“lightbox“ 属性到任何一个链接标签去激活lightbox. 例如: 《a href=“images/image-1.jpg“ rel=“lightbox“ title=“my caption“》image #1《/a》 方式二:如果你有一套你想分组的相关图片, 接着上一部并且又在 rel 属性中添加一个带方括号的组名. 例如: 《a href=“images/image-1.jpg“ rel=“lightbox[roadtrip]“》image #1《/a》 《a href=“images/image-2.jpg“ rel=“lightbox[roadtrip]“》image #2《/a》 《a href=“images/image-3.jpg“ rel=“lightbox[roadtrip]“》image #3《/a》 ******************************************** ******************************************** 基本上就是这么用,我都写的快吐血了 要是还有不明白的,提出来,需要详细代码的话,我可以给你做一个demo lightbox下载地址:prototype.js下载地址(你只需要下在lightbox就可以了,里面包含着个文件了):

什么是surfaceview和surface有区别吗SurfaceHolder和他们的关系

SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。surfaceview提供了一个可见区域,只有在这个可见区域内的surface部分内容才可见,可见区域外的部分不可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果surface上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。你可以通过SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。