App运行日志
- Android采用Log工具打印日志,它将各类日志划分为五个等级
- Log.e:错误信息,比如可能导致程序崩溃的异常
- Log.w:警告信息
- Log.i:一般消息
- Log.d:调试信息,可把程序运行时的变量值打印出来,方便跟踪调试
- Log.v:冗余信息
Log.d("MainActivity","HelloWorld"); //添加一行日志信息
涉及语言
-
java:Java是Android开发的主要编程语言
-
Kotlin:Kotlin是谷歌官方力推的又一种编程语言,它与Java同样基于JVM(Java Virtual Machine,即Java虚拟机),且完全兼容Java语言
-
C/C++:Android的SDK开发包内部定义了许多JNI接口,包括图像读写在内的底层代码均由C/C++编写,再由外部通过封装好的Java方法调用
-
XML:可扩展标记语言,利用各种标签表达页面元素,以及各元素之间的层级关系及其排列组合。每个XML标签都是独立的控件对象,标签内部的属性以“android:”打头,表示这是标准的安卓属性,各属性分别代表控件的某种规格
-
<TextView android:id="@+id/tv_hello" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" />
-
id:控件的编号
-
layout_width:控件的布局宽度,wrap_content表示刚好包住该控件的内容。
-
layout_height:控件的布局高度,wrap_content表示刚好包住该控件的内容。
-
text:控件的文本,也就是文本视图要显示什么文字
-
App的工程结构
App工程目录结构
- app 模块
-
manifests子目录,下面只有一个XML文件,即AndroidManifest.xml,它是App的运行配置文件。
-
java子目录,下面有3个com.example.myapp包,其中第一个包存放当前模块的Java源代码,后面两个包存放测试用的Java代码。
-
res子目录,存放当前模块的资源文件。res下面又有4个子目录:
-
drawable目录存放图形描述文件与图片文件。
-
layout目录存放App页面的布局文件。
-
mipmap目录存放App的启动图标。
-
values目录存放一些常量定义文件,例如字符串常量strings.xml、像素常量dimens.xml、颜色常量colors.xml、样式风格定义styles.xml等。
-
- Gradle Scripts:主要是工程的编译配置文件
- build.gradle,该文件分为项目级与模块级两种,用于描述App工程的编译规则。
- proguard-rules.pro,该文件用于描述Java代码的混淆规则。
- gradle.properties,该文件用于配置编译工程的命令行参数,一般无须改动。
- settings.gradle,该文件配置了需要编译哪些模块。初始内容为include ‘:app’,表示只编译app模块。
- local.properties,项目的本地配置文件,它在工程编译时自动生成,用于描述开发者电脑的环境配置,包括SDK的本地路径、NDK的本地路径等。s
简单控件
- 文本显示、视图基础、常用布局、按钮触控、图像显示
文本显示
- 在XML设置
<Textview
android:id="@+id/tv_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"//设置文本内容
android:textColor="#00ff00"//设置文本颜色
android:textSize="30sp"/>//设置文本大小
- 在java中配置
Textview tv_hello = findViewById(R.id.tv_hello);//通过id获取tv_hello文本视图
tv_hello.setText("Hi World!");//设置tv_hellod的文本内容
tv_hello.setTextColor(0x00ff00);
tv_hello.setTextSize(30);//设置tv_hello文本的大小
-
尺寸单位
- px:px是手机屏幕的最小显示单位,它与设备的显示屏有关。一般来说,同样尺寸的屏幕(比如6英寸手机),如果看起来越清晰,则表示像素密度越高,以px计量的分辨率也越大
- dp:也写作dip,指的是与设备无关的显示单位,它只与屏幕的尺寸有关。一般来说,同样尺寸的屏幕以dp计量的分辨率是相同的,比如同样是6英寸手机,无论它由哪个厂家生产,其分辨率换算成dp单位都是一个大小。
- sp:sp的原理跟dp差不多,但它专门用来设置字体大小。手机在系统设置里可以调整字体的大小(小、标准、大、超大)。设置普通字体时,同数值dp和sp的文字看起来一样大;如果设置为大字体,用dp设置的文字没有变化,用sp设置的文字就变大了。
-
文本内容
//使用@string的资源方式写字符串
//res/value/strings.xml
<resources>
<string name="world">HelloWorld</string>
</resources>
//xml
android:text="@string/world"
//java
tv_hello.setText(R.string.world);
-
文本颜色
- xml更改文本颜色:XML文件无法引用Color类的颜色常量,为此Android制定了一套规范的编码标准,将色值交由透明度alpha和RGB三原色(红色red、绿色green、蓝色blue)联合定义。默认透明度FF(完全不透明)
//方式一:直接写入 android:textColor="#ooffoo" //方式二:通过res/values/colors.xml <resources> <color name="green">#00ff00</color </resources> android:textColor="@color/green"
- java更改文本颜色
tv_hello.setTextColor(Color.GREEN);//通过COlor类
//Color类: 黑色(BLACK)、绿色(GREEN)、蓝色(BLUE)、黄色(YELLOW)、白色(WHITE)、红色(RED)、玫红(MAGENTA)、青色(CYAN)、灰色(GRAY)、深灰(DKGRAY)、浅灰(LTGRAY)、透明(TRANSPARENT)
tv_hello.setTextColor(0x00ff00);//默认透明度为0,看不到
tv_hello.setTextCOlor(0xff00ff00);
视图基础
- xml中设置视图宽高
android:layout_width="match_parent"
android:layout_height="wrap_content"
- 三种取值方式
- match_parent:与上级视图保持一致
- wrap_content:与内容自适应
- 以dp为单位的具体尺寸
- java中设置视图宽高(较复杂)
- 步骤一:调用控件对象的getLayoutParams方法,获取该控件的布局参数,参数类型为ViewGroup.LayoutParams。
- 步骤二:布局参数的width属性表示宽度,height属性表示高度,修改这两个属性值,即可调整控件的宽高。
- 步骤三:调用控件对象的setLayoutParams方法,填入修改后的布局参数使之生效。
- 注意:布局参数的width和height两个数值默认是px单位,需要将dp单位的数值转换为px单位的数值,然后才能赋值给width属性和height属性
// 根据手机的分辨率从 dp 的单位 转成为 px(像素)
public static int dip2px(Context context, float dpValue) {
// 获取当前手机的像素密度(1个dp对应几个px)
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f); // 四舍五入取整
}
------------------------
// 获取名为tv_code的文本视图
TextView tv_code = findViewById(R.id.tv_code);
// 获取tv_code的布局参数(含宽度和高度)
ViewGroup.LayoutParams params = tv_code.getLayoutParams();
// 修改布局参数中的宽度数值,注意默认px单位,需要把dp数值转成px数值
params.width = Utils.dip2px(this, 300);
tv_code.setLayoutParams(params); // 设置tv_code的布局参数
- 设置视图间距
-
margin:设置当前视图与外部视图之间的距离(外边距)
-
padding:设置当前视图与内部视图之间的距离(内边距)
android:layout_margin="10dp" //一次性设置四周的外间距
android:layout_marginTop="5dp"//单独设置外上边距
android:layout_padding="5dp" //一次性设置四周的内边距
android:layout_paddingBottom="5dp"//单独设置内下边距
- 设置视图对齐方式
- layout_gravity:当前视图往上级视图的对齐方式
- gravity:下级视图相对于当前视图的对齐方式
android:layout_gravity="right|bottom"
android:gravity="center"
常用布局
- 线性布局LinearLayout
-
android:orientation
:设置线性方向- horizontal:水平方向
- vertical:垂直方向
-
权重weight
- 如果layout_width填0dp,则layout_weight表示水平方向的权重,下级视图会从左往右分割线性布局;
- 如果layout_height填0dp,则layout_weight表示垂直方向的权重,下级视图会从上往下分割线性布局。
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" //宽度权重占1/3
android:text="横排第一个"
android:textSize="17sp"
android:textColor="#000000" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2" //宽度权重占2/3
android:text="横排第二个"
android:textSize="17sp"
android:textColor="#000000" />
</LinearLayout>
- 相对布局RelativeLayout
- 用于确定下级视图位置的参照物分两种,一种是与该视图自身平级的视图;另一种是该视图的上级视图(也就是它归属的RelativeLayout)。
相对指定视图取值 | 说明 | 相对上级视图取值 | 说明 |
---|---|---|---|
layout_toLeftOf | 左边 | layout_centerInParent | 中间 |
layout_toRightOf | 右边 | layout_centerHorizontal | 水平居中 |
layout_above | 上方 | layout_centerVertical | 垂直居中 |
layout_below | 下方 | layout_alignParentLeft | 左侧对齐 |
layout_alignLeft | 左侧对齐 | layout_alignParentRight | 右侧对齐 |
layout_alignRight | 右侧对齐 | layout_alignParentTop | 顶部对齐 |
layout_alignTop | 顶部对齐 | layout_alignParentBottom | 底部对齐 |
layout_alignBottom | 底部对齐 |
android:layout_centerInParent="true" //中间
android:layout_centerHorizontal="true"//水平中间
android:layout_alignParentLeft="true"//与上级左边对齐
android:layout_alignParentTop="true"//与上级顶部对齐
android:layout_toLeftOf="@+id/tv_center" //相对左对齐
android:layout_alignTop="@+id/tv_center" //顶部平齐
- 网格布局GridLayout
<!-- 根布局为两行两列的网格布局,其中列数由columnCount指定,行数由rowCount指定 -->
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnCount="2" //设置列数
android:rowCount="2"> //设置行数
<TextView ... /><TextView ... />
<TextView ... /><TextView ... />
</GridLayout>
- 滚动视图ScrollView
- 垂直滚动视图:ScrollView,layout_width属性值设置为match_parent,layout_height属性值设置为wrap_content
- 水平滚动视图:HorizontalScrollView,layout_width属性值设置为wrap_content,layout_height属性值设置为match_parent
- 注意:滚动视图节点下面必须且只能挂着一个子布局节点,否则会在运行时报错Caused by:java.lang.IllegalStateException:ScrollView can host only one direct child
按钮触控
- 按钮触控Button
-
textAllCaps属性,默认为true,表示英文全部转为大写,如果设置为false则表示不转为大写。
-
onClick属性,当用户点击按钮时,就自动调用该方法
android:textAllCaps="false" //按钮文本不转为大写
android:onClick="doClick" //点击该按钮触发java代码中的doClick方法
- 点击事件和长按事件
- 点击监听器,需要实现接口View.OnClickListener,并重写onClick方法补充点击事件的处理代码,再由按钮调用setOnClickListener方法设置监听器对象
// 从布局文件中获取名为btn_click_single的按钮控件
Button btn_click_single = findViewById(R.id.btn_click_single);
// 给btn_click_single设置点击监听器,一旦用户点击按钮,就触发监听器的onClick方法
btn_click_single.setOnClickListener(new MyOnClickListener());
-------------------
// 定义一个点击监听器,它实现了接口View.OnClickListener
class MyOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) { }// 点击事件的处理方法
}
// 从布局文件中获取名为btn_click_public的按钮控件
Button btn_click_public = findViewById(R.id.btn_click_public);
// 设置点击监听器,一旦用户点击按钮,就触发监听器的onClick方法
btn_click_public.setOnClickListener(this);
-------------------
@Override
public void onClick(View v) { // 点击事件的处理方法
if (v.getId() == R.id.btn_click_public) { }// 来自于按钮btn_click_public
}
- 长按事件:当控件被按住超过500毫秒会触发,可调用按钮对象的setOnLongClickListener方法设置长按监听器要捕捉按钮的长按事件
// 从布局文件中获取名为btn_click_public的按钮控件
Button btn_longclick_public = findViewById(R.id.btn_longclick_public);
// 设置长按监听器,一旦用户长按按钮,就触发监听器的onLongClick方法
btn_longclick_public.setOnLongClickListener(this);
------------------
@Override
public boolean onLongClick(View v) { // 长按事件的处理方法
if (v.getId() == R.id.btn_longclick_public) { )// 来自于按钮btn_longclick_public
return true;
}
- 值得注意的是,点击监听器和长按监听器不局限于按钮控件,其实它们都来源于视图基类View,凡是从View派生而来的各类控件,均可注册点击监听器和长按监听器。譬如文本视图TextView,其对象也能调用setOnClickListener方法与setOnLongClickListener方法,此时TextView控件就会响应点击动作和长按动作。因为按钮存在按下和松开两种背景,便于提示用户该控件允许点击,但文本视图默认没有按压背景,不方便判断是否被点击,所以一般不会让文本视图处理点击事件和长按事件。
- 禁用与恢复按钮
- xml中,通过属性 android:enabled 设置,属性值为true时启用按钮,为false时禁用按钮
- java中,通过 setEnabled 方法设置按钮的可用状态,true为启用,false为禁用
图像显示
- 图像视图ImageView
- 由于图像通常保存为单独的图片文件,因此需要先把图片放到res/drawable目录,然后再去引用该图片的资源名称。比如现在有张苹果图片名为apple.png,那么XML文件通过属性android:src设置图片资源,属性值格式形如“@drawable/不含扩展名的图片名称”。
//xml
<ImageView
android:id="@+id/iv_scale"
android:layout_width="match_parent"
android:layout_height="220dp"
android:src="@drawable/apple"
android:scaleType="fitCenter"/>//缩放属性
-----------
//java
ImageView iv_scale = findViewById(R.id.iv_scale);// 从布局文件中获取名为iv_scale的图像视图
iv_scale.setImageResource(R.drawable.apple); // 设置图像视图的图片资源
iv_scale.setScaleType(ImageView.ScaleType.FIT_CENTER);// 将缩放类型设置为“保持宽高比例,缩放图片使其位于视图中间”
- 缩放类型的取值说明
XML中缩放类型 | ScaleType类中的缩放类型 | 说明 |
---|---|---|
fitCenter | FIT_CENTER | 保持宽高比例,缩放图片使其位于视图中间 |
centerCrop | CENTER_CROP | 缩放图片使其充满视图(超出部分会被裁剪),并位于视图中间 |
centerInside | CENTER_INSIDE | 保持宽高比例,缩小图片使之位于视图中间(只缩小不放大) |
center | CENTER | 保持图片原尺寸,并使其位于视图中间 |
fitXY | FIT_XY | 缩放图片使其正好填满视图(图片可能被拉伸变形) |
fitStart | FIT_START | 保持宽高比例,缩放图片使其位于视图上方或左侧 |
fitEnd | FIT_END | 保持宽高比例,缩放视图使其位于视图下方或右侧 |
- 图像按钮ImageButton
- 其并非继承Button,而是继承了imageView,所以凡是ImageView拥有的属性和方法,但它毕竟是个按钮呀,按钮家族常用的点击事件和长按事件其也有
- 同时展示文本和图像
- 使用按钮Button即可实现文字周围放置图片
- drawableTop:指定文字上方的图片。
- drawableBottom:指定文字下方的图片。
- drawableLeft:指定文字左边的图片。
- drawableRight:指定文字右边的图片。
- drawablePadding:指定图片与文字的间距。
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_about"
android:drawablePadding="5dp"
android:text="图标在左"
android:textSize="17sp" />
活动Activity
启停活动页面
- Activity的启动和结束
// 从当前页面跳到指定的新页面(ActFinishActivity)
//startActivity(new Intent(ActStartActivity.this,ActFinishActivity.class));
startActivity(new Intent(this, ActFinishActivity.class));
----------------------------
finish(); // 结束当前的活动页面
- Activity的生命周期
- onCreate:创建活动。此时会把页面布局加载进内存,进入了初始状态。
- onStart:开启活动。此时会把活动页面显示在屏幕上,进入了就绪状态。
- onResume:恢复活动。此时活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等。
- onPause:暂停活动。此时活动页面进入暂停状态(也就是退回就绪状态),无法与用户正常交互。
- onStop:停止活动。此时活动页面将不在屏幕上显示。
- onDestroy:销毁活动。此时回收活动占用的系统资源,把页面从内存中清除掉。
- onRestart:重启活动。处于停止状态的活动,若想重新开启的话,无须经历onCreate的重复创建过程,而是走onRestart的重启过程。
- onNewIntent:重用已有的活动实例。
- Activity的启动模式
-
App两种方法设置活动页面的启动模式
- 修改AndroidManifest.xml,在指定的activity节点添加属性android:launchMode,表示本活动以哪个启动模式运行。
- 在代码中调用Intent对象的setFlags方法,表明后续打开的活动页面采用该启动标志。
-
在xml中设置
<activity android:name=".JumpFirstActivity" android:launchMode="standard" />\\默认为standard(标准模式)
launchMode属性值 | 说明 |
---|---|
standard | 标准模式,无论何时启动哪个活动,都是重新创建该页面的实例,并放入栈顶。如果不指定launchMode属性,则默认为标准模式 |
singleTop | 启动新活动时,判断如果栈顶正好就是该活动的实例,则重用该实例;否则创建新的实例并放入栈顶,也就是按照standard模式处理 |
singleTask | 启动新活动时,判断如果栈中存在该活动的实例,则重用该实例,并清除位于该实例上面的所有实例;否则按照standard模式处理 |
singlelnstance | 启动新活动时,将该活动的实例放入一个新栈中,原栈的实例列表保持不变 |
- 在Java中设置
//实现一:在两个活动之间交替跳转
// 创建一个意图对象,准备跳到指定的活动页面
Intent intent = new Intent(this, JumpSecondActivity.class);
// 当栈中存在待跳转的活动实例时,则重新创建该活动的实例,并清除原实例上方的所有实例
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 设置启动标志
startActivity(intent); // 跳转到意图对象指定的活动页面
----------------------
//实现二:登录成功后不再返回登录页面
// 创建一个意图对象,准备跳到指定的活动页面
Intent intent = new Intent(this, LoginSuccessActivity.class);
// 设置启动标志:跳转到新页面时,栈中的原有实例都被清空,同时开辟新任务的活动栈
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent); // 跳转到意图指定的活动页面
setFlags方法 | 说明 |
---|---|
Intent.FLAG_ACTIVITY_NEW_TASK | 开辟一个新的任务栈 |
Intent.FLAG_ACTIVITY_SINGLE_TOP | 当栈顶为待跳转的活动实例之时,则重用栈顶的实例 |
Intent.FLAG_ACTIVITY_CLEAR_TOP | 当栈中存在待跳转的活动实例时,则重新创建一个新实例,并清除原实例上方的所有实例 |
Intent.FLAG_ACTIVITY_NO_HISTORY | 栈中不保存新启动的活动实例 |
Intent.FLAG_ACTIVITY_CLEAR_TASK | 跳转到新页面时,栈中的原有实例都被清空 注意:该标志需要结合LAG_ACTIVITY_NEW_TASK使用,即setFlags方法的参数为“FLAG_ACTIVITY_CLEAR_TASK | LAG_ACTIVITY_NEW_TASK” |
中级控件
图形定制
- 图形Drawable
- Drawable 类型表达了各种各样的图形,包括图片、色块、画板、背景等。包含图片在内的图形文件放在res目录的各个drawable目录下,其中drawable目录一般保存描述性的XML文件,而图片文件一般放在具体分辨率的drawable目录下
- drawable-ldpi里面存放低分辨率的图片(如240×320),现在基本没有这样的智能手机了。
- drawable-mdpi里面存放中等分辨率的图片(如320×480),这样的智能手机已经很少了。
- drawable-hdpi里面存放高分辨率的图片(如480×800),一般对应4英寸~4.5英寸的手机(但不绝对,同尺寸的手机有可能分辨率不同,手机分辨率就高不就低,因为分辨率低了屏幕会有模糊的感觉)。
- drawable-xhdpi里面存放加高分辨率的图片(如720×1280),一般对应5英寸~5.5英寸的手机。
- drawable-xxhdpi里面存放超高分辨率的图片(如1080×1920),一般对应6英寸~6.5英寸的手机。
- drawable-xxxhdpi里面存放超超高分辨率的图片(如1440×2560),一般对应7英寸以上的平板电脑。
- 形状图形
-
Shape图形又称形状图形,它用来描述常见的几何形状,包括矩形、圆角矩形、圆形、椭圆等等
-
形状图形的定义文件是以shape标签为根节点的XML描述文件,它支持四种类型的形状
- rectangle:矩形。默认值
- oval:椭圆。此时corners节点会失效
- line:直线。此时必须设置stroke节点,不然会报错
- ring:圆环
-
除了根节点shape标签,形状图形还拥有下列规格标签:
形状类型 | 描述 | 属性 |
---|---|---|
size (尺寸) | 宽高尺寸 | height:像素类型,图形高度; width:像素类型,图形宽度 |
stroke (描边) | 描边规格 | color:颜色类型,描边的颜色; dashGap:像素类型,每段虚线之间的间隔; dashWidth:像素类型,每段虚线的宽度,若dashGap和dashWidth有一个值为0,则描边为实线; width:像素类型,描边的厚度 |
corners (圆角) | 圆角大小 | bottomLeftRadius:像素类型,左下圆角的半径; bottomRightRadius:像素类型,右下圆角的半径。; topLeftRadius:像素类型,左上圆角的半径; topRightRadius:像素类型,右上圆角的半径; radius:像素类型,4个圆角的半径(若有上面4个圆角半径的定义,则不需要radius定义) |
solid (填充) | 填充色彩 | color:颜色类型,内部填充的颜色 |
padding (间隔) | 与周围边界的间隔 | top:像素类型,与上方的间隔; bottom:像素类型,与下方的间隔; left:像素类型,与左边的间隔; right:像素类型,与右边的间隔 |
gradient (渐变) | 颜色渐变 | angle:整型,渐变的起始角度。为0时表示时钟的9点位置,值增大表示往逆时针方向旋转; type:字符串类型,渐变类型;linear(线性渐变,默认值),radial( 放射渐变,起始颜色就是圆心颜色),sweep(滚动渐变,即一个线段以某个端点为圆心做360度旋转); centerX:浮点型,圆心的X坐标。当android:type="linear"时不可用; centerY:浮点型,圆心的Y坐标。当android:type="linear"时不可用; gradientRadius:整型,渐变的半径。当android:type="radial"时需要设置该属性; centerColor:颜色类型,渐变的中间颜色; startColor:颜色类型,渐变的起始颜色; endColor:颜色类型,渐变的终止颜色; useLevel:布尔类型,设置为true为无渐变色、false为有渐变色。 |
- 在实际开发中,形状图形主要使用3个节点:stroke(描边)、corners(圆角)和solid(填充)。至于shape根节点的属性一般不用设置(默认矩形即可)
生成一个XML描述文件:右击drawable目录,并依次选择右键菜单的New→Drawable resource file
//圆角矩形,内部填充色为土黄色,边缘线为灰色。
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 指定了形状内部的填充颜色 -->
<solid android:color="#ffdd66" />
<!-- 指定了形状轮廓的粗细与颜色 -->
<stroke
android:width="1dp"
android:color="#aaaaaa" />
<!-- 指定了形状四个圆角的半径 -->
<corners android:radius="10dp" />
</shape>
------------------
//椭圆,内部填充色为玫红色,边缘线为灰色
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" >
<!-- 指定了形状内部的填充颜色 -->
<solid android:color="#ff66aa" />
<!-- 指定了形状轮廓的粗细与颜色 -->
<stroke
android:width="1dp"
android:color="#aaaaaa" />
</shape>
创建一个测试页面,并在页面的XML文件中添加名为v_content的View标签,并视图背景设置
// 从布局文件中获取名为v_content的视图
View v_content = findViewById(R.id.v_content);
// v_content的背景设置为圆角矩形
v_content.setBackgroundResource(R.drawable.shape_rect_gold);