前言

本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍:

我的GIthub博客

学习清单:

  • Drawable简介
  • Drawable分类
  • 自定义Drawable

一.为什么要学习Drawable?

Drawable种类繁多,它们都表示一种图像的概念,但是它们不全是图片。在实际开发中,Drawable经常被用来作为View的背景使用。

Drawable可以方便我们做出一些特殊的UI效果,这一点在UI相关的开发工作中极为重要。面对UI设计师设计出来的各式各样的按钮点击效果,动态效果,渐变效果,好看是好看,我们程序员往往会咆哮:"你舒服了,我们呢!!"别慌,学好Drawable,你会对各种效果信手拈来,了然于胸,胸有成竹!!

而且,Drawable在开发中也有自己的优点:

  • 使用简单,成本低于自定义View

  • 非图片类型的Drawable占用空间较小,对于减少APK大小有所裨益

综上,掌握好Drawable,走遍天下也不怕!(jia de)

二.核心知识点归纳

2.1 Drawable简介

Q1:Drawable类是抽象类,是所有Drawable的基类。继承关系如下:

Q2:Drawable使用方式:

  • 创建所需Drawable的根节点的xml,再通过@drawable/xxx引入布局中。(常用)
  • 普通控件(非ImageView)是设置background
  • ImageView是设置src
  • Java代码:new一个所需Drawable并set相关属性,最后加载到布局中。

Q3:内部宽高了解多少

  • 获取方式:getIntrinsicWidth()getIntrinsicHeight()

注意

  • 并不是所有Drawable都有内部宽/高
  • 图片所形成的Drawable的内部宽/高就是图片的宽/高。
  • 颜色所形成的Drawable默认情况下没有内部宽/高的概念(除非指定size)。
  • 内部宽高不等于大小,Drawable没有大小概念
  • Drawable被用作background的时候,自动被拉伸到View同等大小;Drawable被用作src的时候,存放原图大小比例,不会被拉伸

2.2 Drawable种类

2.2.1 BitmapDrawable

  • 表示一张图片
  • 常用属性:
  1. bitmap
  2. |- src="@drawable/res_id"
  3. |- antialias="[true | false]"
  4. |- dither="[true | false]"
  5. |- filter="[true | false]"
  6. |- tileMode="[disabled | clamp | repeat | mirror]"
  7. |- gravity="[top | bottom | left | right | center_vertical |
  8. | fill_vertical | center_horizontal | fill_horizontal |
  9. | center | fill | clip_vertical | clip_horizontal]"
  • src:图片的资源id
  • antialias:是否开启图片抗锯齿。开启后会让图片会更加平滑,同时清晰度降低很少,应该开启。
  • dither:是否开启抖动效果。开启后让高质量的图片的在低质量的屏幕上显示不失真,应该开启。
  • filter:是否开启过滤效果。当图片尺寸被拉伸或压缩时,开启后可保持较好的显示效果,应该开启
  • tileMode:平铺模式。开启后gravity会失效;可选值的具体含义:
可选项 含义
disable 默认值,关闭平铺模式
mirror 在水平和垂直方向的镜面投影效果
repeat 在水平和垂直方向的平铺效果
clamp 图片四周像素会扩散到其他区域

具体效果:

  • gravity:若位图比容器小,可以设置位图在容器中的相对位置。可选值的具体含义:

  • 使用方法:以下两种方法效果相同,图见之前截图中所示的mirror情况。

a.xml:

  1. //在Drawable文件夹中创建bg_tilemode_mirror.xml
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:dither="true"
  5. android:src="@mipmap/ic_launcher"
  6. android:tileMode="mirror"
  7. >
  8. </bitmap>
  9. //在activity_main.xml中设置为View背景
  10. <View
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent"
  13. android:background="@drawable/bg_tilemode_mirror"
  14. />

b.Java代码:

  1. //在MainActivity创建BitmapDrawable
  2. Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
  3. BitmapDrawable bitDrawable = new BitmapDrawable(bitmap);
  4. bitDrawable.setDither(true);
  5. bitDrawable.setTileModeXY(Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
  6. //加载到mylayout布局
  7. LinearLayout myLayout = (LinearLayout) findViewById(R.id.mylayout);
  8. myLayout.setBackgroundDrawable(bitDrawable);

2.2.2 NinePatchDrawable

  • 表示一张.9格式的图片
  • 作用:可自动地根据所需的宽/高进行相应的缩放并保证不失真。
  • 制作方法及原理:可以参考博客:9patch / NinePatch 详解及使用
  • 常用属性:和本文2.2.1 BitmapDrawable一样
  • 使用方法: 不建议用Java代码创建NinePatchDrawable,建议使用XML定义,代码见下。
  1. //在Drawable文件夹中创建bg_nine_patch.xml
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:dither="true"
  5. android:src="@drawable/box"
  6. >
  7. </nine-patch>
  8. //在activity_main.xml中设置为EditText背景
  9. <EditText
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"
  12. android:background="@drawable/bg_nine_patch"
  13. />

2.2.3 ShapeDrawable

  • 可表示纯色、有渐变效果的基础几何图形(矩形,圆形,线条等)
  • 根节点shape,子节点cornersgradientpaddingsizesolidstroke
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <shape
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:shape="[rectangle | oval | line | ring]"
  5. <corners
  6. android:radius="integer"
  7. android:topLeftRaidus="integer"
  8. android:topRightRaidus="integer"
  9. android:bottomLeftRaidus="integer"
  10. android:bottomRightRaidus="integer" />
  11. <gradient
  12. android:angle="integer"
  13. android:centerX="integer"
  14. android:centerY="integer"
  15. android:centerColor="color"
  16. android:endColor="color"
  17. android:gradientRadius="integer"
  18. android:startColor="color"
  19. android:type="[linear | radial | sweep]"
  20. android:useLevel="[true | false]" />
  21. <padding
  22. android:left="integer"
  23. android:top="integer"
  24. android:right="integer"
  25. android:bottom="integer" />
  26. <size
  27. android:width="integer"
  28. android:height="integer" />
  29. <solid
  30. android:color="color" />
  31. <stroke
  32. android:width="integer"
  33. android:color="color"
  34. android:dashWidth="integer"
  35. android:dashGap="integer" />

接下来分别解释各个节点下属性含义:

Q1 shape:图形的形状,可选值有:

  • rectangle(矩形):为默认值。
  • oval(椭圆)
  • line(横线):

注意:必须通过stroke标签来指定横线的宽度和颜色等信息。

  • ring(圆环):
  • 注意:必须通过stroke标签来指定圆环线的宽度和颜色等信息。
  • 圆环还有额外几个属性,如下图所示:

Q2 corners:表示shape的四个圆角的角度,只适用于矩形

  • radius:为四个角同时设定相同的角度。优先级比以下4个属性要低。
  • topLeftRadius:左上角的角度
  • topRightRadius:右上角的角度
  • bottomLeftRadius:左下角的角度
  • bottomRightRadius:右下角的角度

Q3:gradient:渐变效果,与solid纯色填充是互斥的。

  • angle:渐变的角度。
  • 默认为0
  • 值必须为45的倍数。
  • 0表示从左到右,90表示从下到上。
  • centerX:渐变的中心点的X坐标
  • centerY:渐变的中心点的Y坐标
  • startColor:渐变的起始色
  • centerColor:渐变的中间色
  • endColor:渐变的结束色
  • gradientRadius:渐变半径。仅当android:type="radial"时有效
  • useLevel:一般为false,当Drawable作StateListDrawable时为true
  • type:渐变的类别。可选值:
  • linear(线性渐变):默认
  • radial(辐射渐变):需要配合android:gradientRadius属性一起使用。
  • sweep(扫描线渐变):

  • padding:与四周空白的距离。
  • size:图形的固有大小,非最终大小

android:widthandroid:height分别设定shape的宽/高。

  • solid:纯色填充。

android:color:指定填充的颜色。

  • stroke:描边。属性含义:
stroke的属性 作用
width 描边的宽度
color 描边的颜色
dashWidth 虚线的宽度
dashGap 虚线的空隙的间隔

2.2.4 LayerDrawable

  • 表示一种层次化的Drawable集合,通过将不同的Drawable放置在不同的层上面从而达到一种叠加后的效果。
  • 根节点layer-list,常用属性:
  1. layer-list
  2. |- item
  3. | |- drawable="@drawable/drawable_id"
  4. | |- id="@+id/xxx_id"
  5. | |- top="dimension"
  6. | |- left="dimension"
  7. | |- right="dimension"
  8. | |- bottom="dimension"
  9. |

注意:每组 Drawable 由item节点进行配置,一个layer-list可包含多个item,服从下面item覆盖上面item的原则。

A.drawable:所引用的位图资源id,如果为空需要有一个Drawable类型的子节点。

B.id:层id。

C.left:层相对于容器的左边距。

D.right:层相对于容器的右边距。

E.top:层相对于容器的上边距。

F.bottom:层相对于容器的下边距。

  • 实例:bitmap的简单叠加:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item>
  4. <bitmap
  5. android:gravity="center"
  6. android:src="@mipmap/ic_launcher_round"
  7. />
  8. </item>
  9. <item
  10. android:left="20dp"
  11. android:top="30dp">
  12. <bitmap
  13. android:gravity="center"
  14. android:src="@mipmap/ic_launcher_round"
  15. />
  16. </item>
  17. <item
  18. android:left="70dp"
  19. android:top="80dp">
  20. <bitmap
  21. android:gravity="center"
  22. android:src="@mipmap/ic_launcher_round"
  23. />
  24. </item>
  25. </layer-list>

2.2.5 StateListDrawable

  • 表示一个Drawable的集合,每个Drawable对应着View的一种状态
  • 根节点selector,常用属性:
  1. selector
  2. |-constantSize="[true | false]"
  3. |-dither="[true | false]"
  4. |-variablePadding="[true | false]"
  5. |- item
  6. | |- drawable="@drawable/drawable_id"
  7. | |- state_pressed="[true | false]"
  8. | |- state_focused="[true | false]"
  9. | |- state_selected="[true | false]"
  10. | |- state_hovered="[true | false]"
  11. | |- state_checked="[true | false]"
  12. | |- state_checkable="[true | false]"
  13. | |- state_enabled="[true | false]"
  14. | |- state_activated="[true | false]"
  15. | |- state_window_focused="[true | false]"
  16. |

A.selector:

  • constantSize固有大小是否不变。
  • 默认为false,表示固有大小随着状态的改变而改变。

  • 设为true,则表示固有大小是固定值,是内部所有Drawable的固有大小中的最大值

  • dither:是否开启抖动效果。开启后让高质量的图片的比较低质量的屏幕上不失真。默认开启。
  • variblePadding:其padding是否随状态的改变而改变。
  • 默认为false,表示padding是固定值,是其内部所有Drawable的padding中的最大值
  • 为true,则表示padding随着状态的改变而改变。

B.item:

  • drawable:所引用的位图资源id。
  • 表示各种状态的属性:
状态 含义
state_pressed(常用) 按下状态
state_focused 已经获取了焦点
state_selected 选择了View
state_checked 适用于checkBox
state_enabled 表示可用状态
  • 实例:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android" android:constantSize="false" android:dither="true" android:variablePadding="false">
  3. <item android:drawable="@drawable/red_bg" android:state_pressed="false" />
  4. <item android:drawable="@color/black_bg" android:state_pressed="true" />
  5. </selector>

2.2.6 LevelListDrawable

  • 表示一个Drawable集合,集合中的每个Drawable都有一个等级的概念。通过设置不同的等级来切换具体的Drawable
  • 根节点level-list,常用属性:
  1. level-list
  2. |- item
  3. | |- drawable="@drawable/drawable_id"
  4. | |- maxLevel="integer"
  5. | |- minlevel="integer"
  • drawable:引用的位图资源id。
  • maxLevel:对应的最大值,取值范围为0~10000,默认为0。(常用)
  • minlevel:对应的最小值,取值范围为0~10000,默认为0。
  • 使用方法:无论是用xml还是代码实现,若作为View背景,都需要在Java代码中调用setLevel()方法;若作为ImageView前景,需要调用setImageLevel()

  • 加载规则:当某item的android:maxLevel 等于 setLevel所设置的数值时就会被加载。若都没有匹配的则都不显示。

  • 实例:

    1. //在Drawable文件夹中创建bg_level.xml
    2. <?xml version="1.0" encoding="utf-8"?>
    3. <level-list xmlns:android="http://schemas.android.com/apk/res/android">
    4. <item android:maxLevel="1" android:drawable="@drawable/image1" />
    5. <item android:maxLevel="2" android:drawable="@drawable/image2" />
    6. <item android:maxLevel="3" android:drawable="@drawable/image3" />
    7. </level-list>
    8. //在activity_main.xml中设置为ImageView背景
    9. <ImageView
    10. android:id="@+id/image"
    11. android:layout_width="match_parent"
    12. android:layout_height="match_parent"
    13. android:src="@drawable/bg_level"/>
    14. //在MainActivity调用setImageLevel()
    15. ImageView imageView = (ImageView) findViewById(R.id.image);
    16. imageView.setImageLevel(2);

运行结果:ImageView的背景为image2。

2.2.7 TransitionDrawable

  • LayerDrawable的子类,实现两层 Drawable之间的淡入淡出效果。
  • 根节点transition,常用属性和LayerDrawable相同,不再赘述。
  1. transition
  2. |- item
  3. | |- drawable="@drawable/drawable_id"
  4. | |- id="@+id/xxx_id"
  5. | |- top="dimension"
  6. | |- left="dimension"
  7. | |- right="dimension"
  8. | |- bottom="dimension"
  9. |
  • 使用方法:无论是用xml还是代码实现,若作为View背景,都需要在Java代码中调用startTransition()方法才能启动两层间的切换动画,也可以调用reverseTransition()方法反方向切换。

  • 实例:

  1. //在Drawable文件夹中创建bg_tran.xml
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <transition xmlns:android="http://schemas.android.com/apk/res/android">
  4. <item android:drawable="@drawable/image1"/>
  5. <item android:drawable="@drawable/image2"/>
  6. </transition>
  7. //在activity_main.xml中设置为ImageView的src
  8. <ImageView
  9. android:id="@+id/image"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"
  12. android:background="@drawable/bg_tran"
  13. android:src="@drawable/bg_tran"/>
  14. //在MainActivity调用startTransition()
  15. ImageView imageView = (ImageView) findViewById(R.id.image);
  16. TransitionDrawable td = (TransitionDrawable) imageView.getDrawable();
  17. TransitionDrawable td2 = (TransitionDrawable) imageView.getBackground();
  18. td.startTransition(3000);
  19. td2.startTransition(3000);

运行结果:ImageView的背景从image1缓缓切换到image2。

2.2.8 InsetDrawable

  • 表示把一个Drawable嵌入到另外一个Drawable的内部,并在四周留一些间距。

与Drawable的padding属性不同:padding表示的是Drawable的内容与Drawable本身的边距;而InsetDrawable表示的是Drawable与容器之间的边距。

  • 根节点inset,常用属性:
  1. inset
  2. |- drawable="@drawable/drawable_id"
  3. |- visible="[true | false]"
  4. |- insetTop="dimension"
  5. |- insetLeft="dimension"
  6. |- insetRight="dimension"
  7. |- insetBottom="dimension"
  8. |
  • drawable:所引用的位图资源id。
  • visible:是否留有边距。(经测试,发现设置true/false效果一样....)
  • insetTop:设置距离容器的上边距。其他同理。
  • 适用场景:当控件需要的背景比实际的边框
  • 实例:
  1. //在drawable文件夹下创建
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <inset xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:drawable="@drawable/image"
  5. android:insetBottom="40dp"
  6. android:insetLeft="10dp"
  7. android:insetRight="30dp"
  8. android:insetTop="20dp"
  9. android:visible="true">
  10. </inset>

  • 面试题:为一个充满整个屏幕的LinearLayout布局指定背景图,是否可以让背景图不充满屏幕?

答案:可以使用嵌入(Inset)图像资源来指定图像,然后像使用普通图像资源一样使用嵌入图像资源

2.2.9 ScaleDrawable

  • 表示将Drawable缩放到一定比例。
  • 根节点scale,常用属性:
  1. scale
  2. |- drawable="@drawable/drawable_id"
  3. |- scaleGravity="[top | bottom | left | right |
  4. center_vertical | center_horizontal | center |
  5. fill_vertical | fill_horizontal | fill |
  6. clip_vertical | clip_horizontal]"
  7. |- scaleWidth="percentage"
  8. |- scaleHeight="percentage"
  9. |
  • drawable:所引用的位图资源id。
  • scaleGravity:等同于BitmapDrawable的android:gravity
  • scaleWidth/android:scaleHeight:指定Drawable宽/高的缩放比例,以百分比的形式表示。
  • 使用方法:无论是用xml还是代码实现,若作为View背景,都需要在Java代码中调用setLevel()方法控制Drawable等级。
  • level取值范围为0~10000
  • 默认值为0:表示不可见;1~10000:表示可见
  • 一般level设为1即可
  • 实例:将一张图片缩小为原来的30%,代码为:
  1. //在drawable文件夹下创建bg_scale.xml
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <scale xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:drawable="@drawable/drawable_test"
  5. android:scaleGravity="center"
  6. android:scaleHeight="70%"
  7. android:scaleWidth="70%"/>
  8. //在activity_main.xml中设置为ImageView背景
  9. <ImageView
  10. android:id="@+id/image"
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent"
  13. android:src="@drawable/bg_scale"/>
  14. //在MainActivity调用setLevel()
  15. ImageView imageView = (ImageView) findViewById(R.id.image);
  16. ScaleDrawable scaleDrawable = (ScaleDrawable) imageView.getDrawable();
  17. scaleDrawable.setLevel(1);

2.2.10 ClipDrawable

  • 表示裁剪一个Drawable。
  • 根节点clip,常用属性:
  1. scale
  2. |- drawable="@drawable/drawable_id"
  3. |- gravity="[top | bottom | left | right |
  4. center_vertical | center_horizontal | center |
  5. fill_vertical | fill_horizontal | fill |
  6. clip_vertical | clip_horizontal]"
  7. |- clipOrientation="[vertical | horizontal]"
  8. |
  • drawable:所引用的位图资源id。
  • gravity:表示对齐方式,需要和clipOrientation一起发挥作用。可选值含义:

  • clipOrientation:表示裁剪方向,可选值有水平和竖直。
  • 使用方法:无论是用xml还是代码实现,若作为View背景,都需要在Java代码中调用setLevel()方法控制可见区大小。
  • level取值范围为0~10000。
  • 0:表示完全裁剪,即不可见;10000:表示不裁剪。
  • level越大可见区越大。
  • 一般level设为1即可

2.3 自定义Drawable

  • 工作原理的核心是draw():系统调用Drawable的draw()来绘制View的背景或ImageView的图像。
  • 通常没有必要去自定义Drawable,因为无法在XML中使用自定义Drawable,这就降低了其使用范围。
  • 创建自定义Drawable,必须重写其draw()setAlpha()setColorFilter()getOpacity()等方法.以下为自定义Drawable示例:
  1. //自定义Drawable
  2. public class CustomDrawable extends Drawable {
  3. private Paint mPaint;
  4. public CustomDrawable(int color) {
  5. mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  6. mPaint.setColor(color);
  7. }
  8. @Override
  9. public void draw(Canvas canvas) {
  10. final Rect rect = getBounds();
  11. float cx = rect.exactCenterX();
  12. float cy = rect.exactCenterY();
  13. canvas.drawCircle(cx, cy, Math.min(cx, cy), mPaint);
  14. }
  15. @Override
  16. public void setAlpha(int alpha) {
  17. mPaint.setAlpha(alpha);
  18. invalidateSelf();
  19. }
  20. @Override
  21. public void setColorFilter(ColorFilter colorFilter) {
  22. mPaint.setColorFilter(colorFilter);
  23. invalidateSelf();
  24. }
  25. @Override
  26. public int getOpacity() {
  27. return PixelFormat.TRANSLUCENT;
  28. }
  29. }
  • 当自定义的Drawable有固有大小时(Drawable是图片),最好重写getIntrinsicWidth()getIntrinsicHeight(),因为它会影响到View的wrap_content布局。

注意:Drawable的内部大小不等于Drawable的实际大小,后者可通过getBounds()获得,一般它和View的尺寸相同。

三.知识拓展

恭喜你!已经看到这里了,相信你已经对Drawable有一定的见解了!本文只是介绍了Drawable中常用的类型,并没有完全列出所有Drawable的类型,而且只是介绍了XML的创建。

但是,笔者也给好奇心强的读者准备了一些干货(一篇博客),里面详细介绍了Drawable的各种类型,各种创建方法,总的来说还是写得比较不错的。指路:Drawable子类用法总结.

下面展示下本文还没来得及赘述的Drawable:


如果文章对您有一点帮助的话,希望您能点一下赞,您的点赞,是我前进的动力

本文参考链接:

进阶之路 | 奇妙的Drawable之旅的更多相关文章

  1. 进阶之路 | 奇妙的Animation之旅

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习清单: 动画的种类 自定义View动画 View动画的特殊使用场景 属性动画 使用动画的注意事项 一.为什 ...

  2. 进阶之路 | 奇妙的Window之旅

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习清单: Window&WindowManagerService Window&Window ...

  3. 进阶之路 | 奇妙的View之旅

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习清单: View是什么 View的位置参数 View的触控 View的滑动 涉及以下各个知识点: View ...

  4. 进阶之路 | 奇妙的Thread之旅

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 需要已经具备的知识: Thread的基本概念及使用 AsyncTask的基本概念及使用 学习清单: 线程概述 ...

  5. 进阶之路 | 奇妙的Handler之旅

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 需要已经具备的知识: Handler的基本概念及使用 学习导图: 一.为什么要学习Handler? 在Andr ...

  6. 进阶之路 | 奇妙的IPC之旅

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习清单: IPC的基础概念 多进程和多线程的概念 Android中的序列化机制和Binder Android ...

  7. 进阶之路 | 奇妙的Activity之旅

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 本篇文章需要已经具备的知识: Activity的基本概念 AndroidManifest.xml的基本概念 学 ...

  8. GO语言的进阶之路-爬虫进阶之路

    GO语言的进阶之路-爬虫进阶之路 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 网络爬虫是一种自动获取网页内容的程序,是搜索引擎的重要组成部分.我们今天要介绍的就是一个简单的网络爬 ...

  9. SSH进阶之路

    [SSH进阶之路]Hibernate基本原理(一)       在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低 ...

随机推荐

  1. Java入门 - 语言基础 - 05.基本数据类型

    原文地址:http://www.work100.net/training/java-basic-datatype.html 更多教程:光束云 - 免费课程 基本数据类型 序号 文内章节 视频 1 概述 ...

  2. es8对object快速遍历的方法

    let grade = { 'lilei' : 96, 'han' : 99 } //遍历keys console.log(Object.keys(grade)) console.log(Object ...

  3. idea初使用之自动编译

    原文地址:https://blog.csdn.net/diaomeng11/article/details/73826564/ 因为公司需要,方便使用框架以及代码整合,使用同一开发集成环境idea,因 ...

  4. Windows 7原版映像中添加usb3.0驱动

    最近用软碟通制作了一个win7原版映像,但是在装新系统的时候发现了一个问题,进入安装界面后,显示没有找到驱动器,但是明明是差了U盘的,通过“shift+f12”调出命令行窗口,输入disk list命 ...

  5. NOI2.5 1253:Dungeon Master

    描述 You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of ...

  6. Python学习,第五课 - 列表、字典、元组操作

    本篇主要详细讲解Python中常用的列表.字典.元组相关的操作 一.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 通过下标获取元素 #先定义一个列表 le ...

  7. 使用jmeter做接口测试

    1.启动jmeter. 我们可以找到Jmeter/bin 目录下的jmeter-server这个脚本,运行即可. 在下图打开的Jmeter 页面中,右键“测试计划” -> “添加” -> ...

  8. 浅谈openresty

    浅谈openresty 为什么会有OpenResty? 我们都知道Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用 ...

  9. ios--->泛型

    泛型 开发中使用场景: 1.限制集合中的类型,只能检测方法的调用,因为声明的泛型只能存在方法中 2.当一个类在声明的时候,某个对象的属性不确定,只有创建对象的时候才能确定,就可以使用泛型. 使用泛型的 ...

  10. 【WPF学习】第二十七章 Application类的任务

    上一章介绍了有关WPF应用程序中使用Application对象的方式,接下来看一下如何使用Application对象来处理一些更普通的情况,接下俩介绍如何初始化界面.如何处理命名行参数.如何处理支付窗 ...