Android基础-02

Android基础-02

1.单元测试的相关概念

测试分类:

1、根据是否知道源代码分类:

黑盒测试:
白盒测试:

2、根据测试的粒度:

方法测试:写完一个能够独立运行的方法后就去测试;
单元测试:写完一个能够运行的业务逻辑单元就去测试;JUnit单元测试;
模块测试:对模块做整体测试;
集成测试:对整个软件做集成测试;与服务器端做链条测试;
Debug调试:使用debug调试程序;

3、根据测试的次数分类:

压力测试:LoadRunner、Jmeter;
冒烟测试:在同一时间内高频次的访问应用软件;

2.单元测试

01_JUnit单元测试 does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses-library android.test.runner in its AndroidManifest.xml

步骤:

1、写一个业务类,添加了一个业务方法;
2、写一个测试类,添加了一个测试方法(调用了业务类业务方法),使用断言判断是预期结果与实际结果是否相同;
3、在清单文件中添加android.test.InstrumentationTestRunnerhe 和 uses-library android.test.runner;

3.Logcat日志工具的使用

日志的级别:

error:级别最高,使用红色字体显示,程序抛出异常信息使用error级别来打印;
warn: 级别较高,使用橙色字体显示,提供提示需要添加权限都是warn级别打印;
debug: 级别高,使用蓝色字体显示;
info: 级别一般,使用绿色字体显示;
verbose:级别最低,使用黑色字体显示;

4.把数据存储到文件并的取数据显示在界面上

在Android应用程序中存储数据的方式:

1、文件
2、使用SharedPreferences保存数据
3、使用SQLite数据库
4、使用ContentProvider内容提供者
5、通过网络把数据保存到服务器上

1、保存数据到文件上:

代码:

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"

android:orientation="vertical" tools:context=".MainActivity" >

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_username"
    android:hint="请输入用户名" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_pwd"
    android:inputType="textPassword"
    android:hint="请输入密码" />

<Button
     android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="保存"
    android:onClick="save"
    />

</LinearLayout>

MainActivity.java:

package com.itheima.savetofile;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText et_username;
    private EditText et_pwd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_username = (EditText) findViewById(R.id.et_username);
        et_pwd = (EditText) findViewById(R.id.et_pwd);

        try {
            //从文件中读取数据
            File file = new File("/data/data/com.itheima.savetofile/files/info.txt");
            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);

            String info = br.readLine();

            //把数据显示在输入框中
            if(!TextUtils.isEmpty(info)){
                String[] array = info.split("##");
                String username = array[0];

                String pwd = array[1];
                et_username.setText(username);
                et_pwd.setText(pwd);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void save(View view){

        String username = et_username.getText().toString().trim();
        String pwd = et_pwd.getText().toString().trim();

        if(TextUtils.isEmpty(username) || TextUtils.isEmpty(pwd)){
            Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
            return;
        }else{
            try {
                //把用户名和密码保存到文件上

//              File file = new File("/data/data/com.itheima.savetofile/info.txt");
//              FileOutputStream fos = new FileOutputStream(file);

                //使用另外一个API创建一个文件
                //获得/data/data/com.itheima.savetofile/files目录对象,并且打开指定的文件,如果该文件不存在,就会创建这个文件
                FileOutputStream fos = this.openFileOutput("info.txt", Context.MODE_PRIVATE);

                fos.write((username+"##"+pwd).getBytes());

                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

6.存储到SD卡(重点)

代码:

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
    android:orientation="vertical"
tools:context=".MainActivity" >

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_username"
    android:hint="请输入用户名" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_pwd"
    android:inputType="textPassword"
    android:hint="请输入密码" />

<Button
     android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="保存"
    android:onClick="save"
    />

</LinearLayout>

MainActivity.java:

package com.itheima.savetosdcard;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

private EditText et_username;
private EditText et_pwd;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et_username = (EditText) findViewById(R.id.et_username);
    et_pwd = (EditText) findViewById(R.id.et_pwd);

    try {
        //从文件中读取数据
        File file = new File(Environment.getExternalStorageDirectory()+"/info.txt");
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);

        String info = br.readLine();

        //把数据显示在输入框中
        if(!TextUtils.isEmpty(info)){
            String[] array = info.split("##");
            String username = array[0];

            String pwd = array[1];
            et_username.setText(username);
            et_pwd.setText(pwd);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

}

public void save(View view){

    String username = et_username.getText().toString().trim();
    String pwd = et_pwd.getText().toString().trim();

    if(TextUtils.isEmpty(username) || TextUtils.isEmpty(pwd)){
        Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
        return;
    }else{
        try {
            //把用户名和密码保存到文件上
            //获得SD卡的根目录,并且创建一个文件
            File file = new File(Environment.getExternalStorageDirectory()+"/info.txt");
            FileOutputStream fos = new FileOutputStream(file);

            //使用另外一个API创建一个文件
            //获得/data/data/com.itheima.savetofile/files目录对象,并且打开指定的文件,如果该文件不存在,就会创建这个文件
            //              FileOutputStream fos = this.openFileOutput("info.txt", Context.MODE_PRIVATE);

            fos.write((username+"##"+pwd).getBytes());

            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

}

7.获取SD的大小及可用空间

代码:

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="获得SD的空间"
    android:onClick="click"
    />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/tv_space" />

</LinearLayout>

MainActivity.java:

package com.itheima.sdcardspace;

import java.io.File;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.text.format.Formatter;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView tv_space;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_space = (TextView) findViewById(R.id.tv_space);
    }

    public void click(View view){
        //获得SD卡的根目录对象
        File file = Environment.getExternalStorageDirectory();

        long  totalSpace = file.getTotalSpace();

        long usableSpace = file.getUsableSpace();

        String total = Formatter.formatFileSize(this, totalSpace);

        String usable = Formatter.formatFileSize(this, usableSpace);

        tv_space.setText(usable+"/"+total);
    }
}

8.文件的权限概念

第一位:文件类型:

第一组权限:当前用户拥有的权限;

第二组权限:所属组拥有的权限;

第三组权限:其他用户拥有的权限;

文件的4种操作模式:

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入: 

  openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data//files),其他程序无法访问。除非在创建时指定了Context.MODEWORLDREADABLE或者Context.MODEWORLDWRITEABLE
,只有这样其他程序才能正确访问。

9.权限的使用

代码:

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="使用私有模式保存数据"
    android:onClick="save01" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="使用追加模式保存数据"
    android:onClick="save02" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="使用可读模式保存数据"
    android:onClick="save03" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="使用可写模式保存数据"
    android:onClick="save04" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="使用可读可写模式保存数据"
    android:onClick="save05" />

</LinearLayout>

MainActivity.java:

package com.itheima.filepermission;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void save01(View view) {

        try {
            FileOutputStream fos = this.openFileOutput("info.txt",
                    Context.MODE_PRIVATE);
            fos.write("private".getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void save02(View view) {

        try {
            FileOutputStream fos = this.openFileOutput("info.txt",
                    Context.MODE_APPEND);
            fos.write("append".getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void save03(View view) {

        try {
            FileOutputStream fos = this.openFileOutput("info.txt",
                    Context.MODE_WORLD_READABLE);
            fos.write("readable".getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void save04(View view) {

        try {
            FileOutputStream fos = this.openFileOutput("info.txt",
                    Context.MODE_WORLD_WRITEABLE);
            fos.write("writeable".getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void save05(View view) {

        try {
            FileOutputStream fos = this.openFileOutput("info.txt",
                    Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
            fos.write("append".getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

10.SharedPreferences存储数据(重点)

应用场景:保存给软件设置的参数;

代码:

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
    android:orientation="vertical"
tools:context=".MainActivity" >

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_username"
    android:hint="请输入用户名" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/et_pwd"
    android:hint="请输入密码" />

<Button
     android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="保存"
    android:onClick="save"
    />
</LinearLayout>

MainActivity.java:

package com.itheima.sp;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    private EditText et_username;

    private EditText et_pwd;

    private SharedPreferences sp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_username = (EditText) findViewById(R.id.et_username);
        et_pwd = (EditText) findViewById(R.id.et_pwd);

        //获得sp对象
        sp = this.getSharedPreferences("info", Context.MODE_PRIVATE);
        //根据参数名查找参数
        String name = sp.getString("name", "");
        String pwd = sp.getString("pwd", "");
        et_username.setText(name);
        et_pwd.setText(pwd);

    }

    public void save(View view){
        String username = et_username.getText().toString().trim();
        String pwd = et_pwd.getText().toString().trim();

        if(TextUtils.isEmpty(username) || TextUtils.isEmpty(pwd)){
            Toast.makeText(this, "用户名或密码不能为空", 0).show();
            return;
        }else{
            //使用SharedPreferences保存数据
            //得到系统提供的SharedPreferences对象
            //info 保存数据的文件名
            //mode 保存文件使用操作模式
            sp = this.getSharedPreferences("info", Context.MODE_PRIVATE);
            //获得sp的编辑器
            Editor editor = sp.edit();
            //使用editor数据
            editor.putString("name", username);

            editor.putString("pwd", pwd);
            //只有调用了commit或者apply方法才能把数据保存sp对象中
            editor.commit();

            Toast.makeText(this, "保存成功", 0).show();
        }
    }
}

11.序列化xml格式的数据到文件上

应用场景:备份短信、联系人;

代码:

package com.itheima.serializerablexml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.xmlpull.v1.XmlSerializer;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void save(View view) {
        try {
            // 得到序列化器
            XmlSerializer s = Xml.newSerializer();

            // 初始化序列化器
            File file = new File(Environment.getExternalStorageDirectory()
                    + "/news.xml");
            FileOutputStream fos = new FileOutputStream(file);
            s.setOutput(fos, "UTF-8");

            // 序列化数据
            s.startDocument("UTF-8", true);

            // channel
            s.startTag(null, "channel");
            // item
            s.startTag(null, "item");

            // title
            s.startTag(null, "title");
            s.text("港媒曝剧组疑潜规则 女星陪制片1周3次");
            s.endTag(null, "title");

            // description
            s.startTag(null, "description");
            s.text("据香港媒体报道,演艺圈潜规则时有所闻,日前男星刘至翰更在网上曝光一张疑似剧组人员与女星的对话截图“先签合同,拍了再陪,无需顾虑”,让刘至翰气骂此歪风践踏梦想又物化女性。");
            s.endTag(null, "description");

            // image
            s.startTag(null, "image");
            s.text("http://192.168.20.91:8080/image/1.jpg");
            s.endTag(null, "image");

            // type
            s.startTag(null, "type");
            s.text("1");
            s.endTag(null, "type");

            s.endTag(null, "item");

            s.endTag(null, "channel");

            s.endDocument();

            fos.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

12.使用pull解析xml格式的数据 (重要)

SAX、DOM4j,DOM

pull:事件类型的解析器;

事件类型:

START_DOCUMENT 解析到文档的开头部分;
END_DOCUMENT解析到文档的结尾部分;
START_TAG 标签的开头部分;
END_TAG 标签的结束部分;

代码:

package com.itheima.pullxml;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void parse(View view) {

        try {
            // 得到pull解析器
            XmlPullParser parser = Xml.newPullParser();

            // 初始化解析器
            File file = new File(Environment.getExternalStorageDirectory()
                    + "/news.xml");
            FileInputStream fis = new FileInputStream(file);
            parser.setInput(fis, "UTF-8");

            // 得到解析的事件类型
            int type = parser.getEventType();

            while (type != XmlPullParser.END_DOCUMENT) {

                switch (type) {
                case XmlPullParser.START_TAG://解析到开始标签位置
                    if ("item".equals(parser.getName())) {//获得标签的名称
                        System.out.println("....item........");
                    } else if ("title".equals(parser.getName())) {

                        //获得标签体的内容
                        String title = parser.nextText();
                        System.out.println("title:" + title);
                    } else if ("description".equals(parser.getName())) {
                        String description = parser.nextText();
                        System.out.println("description:" + description);
                    }else if ("image".equals(parser.getName())) {
                        String image = parser.nextText();
                        System.out.println("image:" + image);
                    }else if ("type".equals(parser.getName())) {
                        String newstype = parser.nextText();
                        System.out.println("type:" + newstype);
                    }else if ("comment".equals(parser.getName())) {
                        String comment = parser.nextText();
                        System.out.println("comment:" + comment);
                    }

                    break;

                case XmlPullParser.END_TAG://解析到标签的结束位置
                    if ("item".equals(parser.getName())) {
                        System.out.println("..../ item........");
                    } 

                    break;
                }
//              解析下一个标签
                type =  parser.next();
            }

            fis.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
时间: 2024-11-07 05:55:54

Android基础-02的相关文章

《Android基础》课程指导

<Android编程权威指南>是一本好书,也是我们<Android基础>课程教材. 课程鼓励学生使用Android Studio,但这本书使用的开发工具是ADT.为了帮助学生更好的使用教材,我把书中部分章节用Android Studio重新实现了一遍.并对一些截图和案例讲解做了替换和微调. 为了便于索引,本文的结构目录与教材基本一致.未做改变的章节或大段内容,仅保留代码片段,文字不再重复描述.请参考教材,理解和完成对应章节的内容. 此博客用来记录"重新实现"书中

Android基础01 快速入门 &amp; 布局

Android基础01 快速入门 & 布局 01.01  手机制式 第一代模拟制式手机(1G):1G就是大哥大,手机类似于简单的无线电双工电台,通话是锁定在一定频率,所以使用可调频电台就可以窃听通话.   第二代GSM.CDMA等数字手机(2G):手机使用PHS,GSM或者CDMA这些十分成熟的标准,具有稳定的通话质量和合适的待机时间,支持彩信业务的GPRS和上网业务的WAP服务,以及各式各样的Java程序等. 第三代移动通信技术(3G):3G,是英文3rd Generation的缩写,指第三代

Android基础-07

Android基础-07 广播与服务 01_为什么需要广播接受者 电台:中央人民广播电台,93.4mhz: 收音机:93.4mhz,收听广播: Android系统内置的电台,发送一些事件:接收短信.外拨电话.电量不足.电量充满.SD插拔.软件安装与下载等. Android应用程序中的收音机:广播接收者,指定需要接收的事件类型: 可以做一些对用户有用的业务逻辑操作. 广播接收者的特点: 1.即使广播接收者没有运行,当广播事件到达的时候,系统会自动启动广播接收者,并且调用onReceive方法处理消

Android基础3

一.内容观察者的运行原理 运行过程通常为A应用对内容提供者暴露的数据进行修改,而B应用负则专门责监听内容提供者数据的变化. 1.简单的小演示 首先在内容提供者写一个MyContentProvider类继承ContentProvider如下 public class MyContentProvider extends ContentProvider 继承后会自动重写6个方法(增删改查onCreat和getBytes)在B应用对应修改的方法(增删改)中发出通知,getContext().getCon

Android基础知识点总结

Android基础知识点总结 在学习了很长一段时间的Android基础内容,如果不做及时的复习,那么后面的项目学习起来可能就没那么顺利了,并且复习也是一件很愉快的事.古人有云:"学而时习之不亦说乎",应该就是这个道理. ~本文大纲~ Android基础知识点总结 Day01 01Android系统中我们常用的4种数据存储方式 02获取手机内存空间大小 03XML文件的生成和解析 GET新技能 Day02 SQLiteOpenHelper的基本用法 数据库事务 Listview的简单优化

Android逆向-Android基础逆向(2-2)

[toc] #0x00 前言##不知所以然,请看Android逆向-Android基础逆向(1)Android逆向-Android基础逆向(2)##以及java系列:Android逆向-java代码基础(1)Android逆向-java代码基础(2)Android逆向-java代码基础(3)Android逆向-java代码基础(4)Android逆向-java代码基础(5)Android逆向-java代码基础(6)Android逆向-java代码基础(7)Android逆向-java代码基础(8

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert