资源的类型和使用

1. 任何资源文件应该存放在 /res/ 目录中的子目录中,不应直接存放在 /res/ 目录中,否则容易出现编译错误。

2. 如果需要更新或修改配置的资源文件,应该直接到对应的 /res/子目录 中的对应的配置文件中修改。

/res/animator/
 存放:用于定义属性动画的 XML 文件。/res/anim/
 存放:用于定义渐变动画的 XML 文件。/res/color/
 存放:用于定义颜色状态列表的 XML 文件。/res/animator/
 存放:用于定义属性动画的 XML 文件。/res/drawable/
 存放:图片文件,位图文件,或者对应的可使用的 XML 文件。/res/mipmap/
 存放:适用于不同启动器图标密度的可绘制对象文件。一般用于存放 ICON 文件。/res/layout/
 存放:用于定义用户界面布局的 XML 文件。/res/menu/
 存放:用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件。/res/raw/
 存放:要以原始形式保存的任意文件。/res/values/
 存放:包含字符串、整型数和颜色等简单值的 XML 文件。一般指的是属性配置参数及控件组件显示的文字。/res/xml/
 存放:可以在运行时通过调用 Resources.getXML() 读取的任意 XML 格式配置文件。

字符串,颜色,尺寸

案例:字符串,颜色,尺寸的具体定义和使用

android开发图片位置移动 安卓开发图片放在哪里_android开发图片位置移动

就是在对应的xml文件中添加内容就可以了 

Drawable

案例:使用图片资源

图片放在Drawable中,引用加@

android开发图片位置移动 安卓开发图片放在哪里_控件_02

 

案例:使用State List 制作按钮按下变色的效果

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--非按下状态的颜色-->
    <item
        android:state_pressed="false"
        android:color="#ff000000"/>
<!--    按下状态的颜色-->
    <item
        android:state_pressed="true"
        android:color="#ffff0000"/>
</selector>
(一)android:drawable
 这个属性是必须的,为当前控件指定资源。(二)android:state_pressed
 布尔值。true指当用户点击或者触摸该控件的状态。默认为false;一般用于设置按钮颜色/图片的设置。(三)android:state_focused
 布尔值。ture指当前控件获得焦点时的状态。默认为false;一般用于EdiText。(四)android:state_hovered
 布尔值。true表示光标移动到当前控件上的状态。默认为false;光标是否悬停,通常与state_focused 相同,它是4.0的新特性,一般用于EdiText。(五)android:state_selected
 布尔值。true表示被选择的状态,例如在一个下拉列表中用方向键下选择其中一个选项。
 这个和focus的区别,selected是focus不充分的情况。比如一个listview获得焦点(focus),而用方向键选择了其中的一个item(selected)(六)android:state_checkable
 布尔值。ture表示可以被勾选的状态。这个仅在当控件具有被勾选和不被勾选的状态间转换时才起作用。(七)android:state_checked
 布尔值。true表示当前控件处于被勾选(check的状态)(八)android:state_enabled
 布尔值。true表示当前控件出于可用的状态。比如可以被点击(九)android:state_activated
 布尔值。true表示当前控件被激活的状态。
 android:state_window_focused

布尔值。true表示当前控件出于最前端时,应用窗口获得焦点的状态。

android开发图片位置移动 安卓开发图片放在哪里_android_03

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity2d28">
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="24sp"
    android:text="Click me"
    android:textColor="@drawable/drawable"/>
</LinearLayout>

 

案例:使用shape Drawable制作圆形矩形的编辑框

android开发图片位置移动 安卓开发图片放在哪里_android开发图片位置移动_04

android:shape="rectangle"形状为矩形 <gradient/>定义渐变色 android:startColor="#999999"渐变起始颜色 android:endColor="#ffffff"渐变结束颜色 android:angle="0"渐变角度 0代表从左到右,90代表从上到下 <corners/>定义角为圆角 <stroke/>定义线的颜色和宽度 

android开发图片位置移动 安卓开发图片放在哪里_android开发图片位置移动_05

 

Style

案例:使用style统一设置文字的大小和颜色

style好处就是减少代码的工作量

android开发图片位置移动 安卓开发图片放在哪里_XML_06

android开发图片位置移动 安卓开发图片放在哪里_android开发图片位置移动_07

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="TextStyle">
        <item name="android:textSize">20sp</item>
        <item name="android:textColor">#00ff00</item>
    </style>
</resources>

 

国际化

案例:制作同样的按钮在不同的语言环境下的显示

国际化是值同一个应用在不改变逻辑结构的情况下,在不同语言环境中可以有不同的显示。例如将手机的语言环境切换为英文,许多应用会自动显示为英语。以字符串资源为例,实现国际化创建values文件夹,values文件夹的命名方式为values-语言码-r国家码,例如values-zh-rCN代表简体中文,values-en-rUS代表美式英语

事件处理和消息传递

案例:Handler基于回调事件的处理

android开发图片位置移动 安卓开发图片放在哪里_动画_08

package com.example.commoncontrols2;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity2d27 extends AppCompatActivity {
    private final int MSG_ID=1001;
    private TextView txt;
    private MyHandler mHandler=new MyHandler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity2d27);
        txt=(TextView) findViewById(R.id.txt);
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                int num=new Random().nextInt(1000);
                Message msg=new Message();
                msg.what=MSG_ID;
                msg.obj=num;
                mHandler.sendMessage(msg);
            }
        },1000,1000);
    }

    private class MyHandler extends Handler {
        public void handleMessage(Message msg){
            switch (msg.what){
                case MSG_ID:
                {
                    int num=(Integer)msg.obj;
                    txt.setText("The num is"+num);
                    break;
                }
                default:
                    super.handleMessage(msg);
                    break;
            }
        }
    }
}

 每隔一秒生成一个随机数

private MyHandler mHandler=new MyHandler(); 定义一个Handler对象

new Timer().schedule(new TimerTask() {使用Timer启动一个定时任务
    @Override
    public void run() {
        int num=new Random().nextInt(1000);生成一个随机数
        Message msg=new Message();//定义一个消息体
        msg.what=MSG_ID;//设置消息ID
        msg.obj=num;//设置消息内容
        mHandler.sendMessage(msg);//使用Handler发送消息
    }
},1000,1000);//每隔一秒执行一次 一个是延迟 第二个是隔一秒

private class MyHandler extends Handler继承Handler类