2014-08-13 09:53:17 DavyJonesWang 阅读数 384
  • XML编程

    在现代的开发之中,XML技术无处不在,在各个开发框架中,也都到处充斥着XML配置文件的身影。本课程将为读者讲解XML的产生背景,并且详细分析了HTML与XML的区别、XML核心语法,重点在于XML的解析技术(DOM、SAX、DOM4J工具),同时讲解了如何在HTML页面利用JavaScript进行DOM解析实现页面动态开发。官方QQ群:612148723。

    4174 人正在学习 去看看 李兴华

Android解析XML

         在Android平台上可以使用Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器解析XML文件。

        下面是本例子要解析的XML文件:itcast.xml

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<persons>
  <person id="23">
    <name>李明</name>
    <age>30</age>
  </person>
  <person id="20">
    <name>李向梅</name>
    <age>25</age>
  </person>
</persons>
复制代码

        例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码:

复制代码
public class Person {

    private Integer id;
    private String name;
private Short age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
}

    public Short getAge() {
        return age;
    }

    public void setAge(Short age) {
        this.age = age;
    }
}
复制代码

 

1. SAX解析XML文件

        SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备。 SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML语法中的某部分,如果符合就会触发事件。所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口。

 

复制代码
public static List<Person> readXML(InputStream inStream) {
   try {
            //创建解析器
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser saxParser = spf.newSAXParser();
 
            //设置解析器的相关特性,true表示开启命名空间特性
            saxParser.setProperty("http://xml.org/sax/features/namespaces",true);
            XMLContentHandler handler = new XMLContentHandler();
            saxParser.parse(inStream, handler);
            inStream.close();

            return handler.getPersons();
   } catch (Exception e) {
            e.printStackTrace();
   }

  return null;
}

 
//SAX类:DefaultHandler,它实现了ContentHandler接口。在实现的时候,只需要继承该类,重载相应的方法即可。
public class XMLContentHandler extends DefaultHandler {

            private List<Person> persons = null;
            private Person currentPerson;
            private String tagName = null;//当前解析的元素标签

             public List<Person> getPersons() {
                        return persons;
            }
 
            //接收文档开始的通知。当遇到文档的开头的时候,调用这个方法,可以在其中做一些预处理的工作。
            @Override
            public void startDocument() throws SAXException {
                        persons = new ArrayList<Person>();
            }

             //接收元素开始的通知。当读到一个开始标签的时候,会触发这个方法。其中namespaceURI表示元素的命名空间;
            //localName表示元素的本地名称(不带前缀);qName表示元素的限定名(带前缀);atts 表示元素的属性集合
            @Override
            public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {

                        if(localName.equals("person")){
                                    currentPerson = new Person();
                                    currentPerson.setId(Integer.parseInt(atts.getValue("id")));
                        }

                        this.tagName = localName;
            }
 
            //接收字符数据的通知。该方法用来处理在XML文件中读到的内容,第一个参数用于存放文件的内容,
            //后面两个参数是读到的字符串在这个数组中的起始位置和长度,使用new String(ch,start,length)就可以获取内容。
            @Override
            public void characters(char[] ch, int start, int length) throws SAXException {

                        if(tagName!=null){
                                    String data = new String(ch, start, length);
                                    if(tagName.equals("name")){
                                                this.currentPerson.setName(data);
                                    }else if(tagName.equals("age")){
                                                this.currentPerson.setAge(Short.parseShort(data));
                                    }
                        }
            }

             //接收文档的结尾的通知。在遇到结束标签的时候,调用这个方法。其中,uri表示元素的命名空间;
            //localName表示元素的本地名称(不带前缀);name表示元素的限定名(带前缀)
            @Override
            public void endElement(String uri, String localName, String name) throws SAXException {

                        if(localName.equals("person")){
                                    persons.add(currentPerson);
                                    currentPerson = null;
                        }

                        this.tagName = null;
            }
}
复制代码

 

2. DOM解析XML文件

     DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用DOM是可行的。

复制代码
public static List<Person> readXML(InputStream inStream) {

            List<Person> persons = new ArrayList<Person>();

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            try {
                        DocumentBuilder builder = factory.newDocumentBuilder();
                        Document dom = builder.parse(inStream);

                        Element root = dom.getDocumentElement();

                        NodeList items = root.getElementsByTagName("person");//查找所有person节点

                        for (int i = 0; i < items.getLength(); i++) {
                                    Person person = new Person();

                                    //得到第一个person节点
                                    Element personNode = (Element) items.item(i);

                                    //获取person节点的id属性值
                                    person.setId(new Integer(personNode.getAttribute("id")));

                                    //获取person节点下的所有子节点(标签之间的空白节点和name/age元素)
                                    NodeList childsNodes = personNode.getChildNodes();

                                    for (int j = 0; j < childsNodes.getLength(); j++) {
                                                Node node = (Node) childsNodes.item(j); //判断是否为元素类型

                                                if(node.getNodeType() == Node.ELEMENT_NODE){   
                                                            Element childNode = (Element) node;

                                                        //判断是否name元素
                                                            if ("name".equals(childNode.getNodeName())) {
                                                                        //获取name元素下Text节点,然后从Text节点获取数据
                                                                       person.setName(childNode.getFirstChild().getNodeValue());                                                                               } else if (“age”.equals(childNode.getNodeName())) {
                                                                        person.setAge(new Short(childNode.getFirstChild().getNodeValue()));
                                                            }
                                                }
                                    }

                                    persons.add(person);
                        }

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

            return persons;
}
复制代码

 

3.Pull解析器解析XML文件

         Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

复制代码
//读取XML
public static List<Person> readXML(InputStream inStream) {

            XmlPullParser parser = Xml.newPullParser();

            try {
                        parser.setInput(inStream, "UTF-8");
                        int eventType = parser.getEventType();

                        Person currentPerson = null;
                        List<Person> persons = null;

                        while (eventType != XmlPullParser.END_DOCUMENT) {
                                    switch (eventType) {
                                    case XmlPullParser.START_DOCUMENT://文档开始事件,可以进行数据初始化处理
                                                persons = new ArrayList<Person>();
                                                break;

                                     case XmlPullParser.START_TAG://开始元素事件
                                                String name = parser.getName();
                                                if (name.equalsIgnoreCase("person")) {
                                                            currentPerson = new Person();
                                                            currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));
                                                } else if (currentPerson != null) {
                                                            if (name.equalsIgnoreCase("name")) {
                                                                        currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值
                                                            } else if (name.equalsIgnoreCase("age")) {
                                                                        currentPerson.setAge(new Short(parser.nextText()));
                                                            }
                                                }
                                                break;
 
                                    case XmlPullParser.END_TAG://结束元素事件
                                                if (parser.getName().equalsIgnoreCase("person") && currentPerson != null) {
                                                            persons.add(currentPerson);
                                                            currentPerson = null;
                                                }

                                                break;
                                    }

                                     eventType = parser.next();
                        }

            inStream.close();
            return persons;
            } catch (Exception e) {
                        e.printStackTrace();
            }

            return null;
}

 
//成XML文件
//使用Pull解析器生成一个与itcast.xml文件内容相同的myitcast.xml文件。
public static String writeXML(List<Person> persons, Writer writer){

    XmlSerializer serializer = Xml.newSerializer();

    try {
        serializer.setOutput(writer);
        serializer.startDocument("UTF-8", true);

        //第一个参数为命名空间,如果不使用命名空间,可以设置为null
        serializer.startTag("", "persons");

        for (Person person : persons){
            serializer.startTag("", "person");
            serializer.attribute("", "id", person.getId().toString());
            serializer.startTag("", "name");
            serializer.text(person.getName());
            serializer.endTag("", "name");
            serializer.startTag("", "age");
            serializer.text(person.getAge().toString());
            serializer.endTag("", "age");
            serializer.endTag("", "person");
        }

        serializer.endTag("", "persons");
        serializer.endDocument();

        return writer.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

 
//使用代码如下(生成XML文件):

File xmlFile = new File("myitcast.xml");
FileOutputStream outStream = new FileOutputStream(xmlFile);
OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");
BufferedWriter writer = new BufferedWriter(outStreamWriter);

writeXML(persons, writer);
writer.flush();
writer.close();

 
//如果只想得到生成的xml内容,可以使用StringWriter:
StringWriter writer = new StringWriter();
writeXML(persons, writer);
String content = writer.toString();
复制代码

 

 4.SAX和PULL使用

    区别为:SAX解析器的工作方式是自动将事件推入事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。
    你随便找个sax和pull的例子比较一下就可以发现,pull是一个while循环,随时可以跳出,而sax不是,sax是只要解析了,就必须解析完成。

2018-04-26 18:27:42 u011435933 阅读数 101
  • XML编程

    在现代的开发之中,XML技术无处不在,在各个开发框架中,也都到处充斥着XML配置文件的身影。本课程将为读者讲解XML的产生背景,并且详细分析了HTML与XML的区别、XML核心语法,重点在于XML的解析技术(DOM、SAX、DOM4J工具),同时讲解了如何在HTML页面利用JavaScript进行DOM解析实现页面动态开发。官方QQ群:612148723。

    4174 人正在学习 去看看 李兴华

java中有jaxb可以通过注解,用来解析和生成XML,在Java环境中运行无误

但是在android环境下,运行会报错,且jaxb并未集成到android SDK中,需要导包,而且jaxb包较大,所以没什么必要在android中使用jaxb。

事实上,android也提供了轻量级的xml处理工具,pullxml,当然它的机制应该不是映射的,应该是直接生成的,所以写起来比jaxb麻烦不少,需要定制处理工具,不能像jaxb那样直接从java对象映射为xml文件,但是也还算好用。

具体实现,可以参考下面博客:

https://www.cnblogs.com/liqw/p/4267461.html


2016-08-10 16:56:26 zhanggaofeixy 阅读数 192
  • XML编程

    在现代的开发之中,XML技术无处不在,在各个开发框架中,也都到处充斥着XML配置文件的身影。本课程将为读者讲解XML的产生背景,并且详细分析了HTML与XML的区别、XML核心语法,重点在于XML的解析技术(DOM、SAX、DOM4J工具),同时讲解了如何在HTML页面利用JavaScript进行DOM解析实现页面动态开发。官方QQ群:612148723。

    4174 人正在学习 去看看 李兴华

【Android】实现XML解析的几种技术(参考IT大牛的经验)

第一种方式:DOM解析器:

DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。

Android完全支持DOM 解析。利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。

DOM的工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档——这就是DOM的工作原理。

DOM实现时首先为XML文档的解析定义一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,这样代码就可以使用DOM接口来操作整个树结构。

由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。 当然,如果XML文件的内容比较小,采用DOM是可行的。

第二种方式:SAX解析器:

SAX(Simple API for XML)解析器是一种基于事件的解析器,事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。它的核心是事件处理模式,

主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,

还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。

SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。

SAX的工作原理:SAX的工作原理简单地说就是对文档进行顺序扫描,

当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

第三种方式:PULL解析器:

Android并未提供对Java StAX API的支持。但是,Android附带了一个pull解析器,其工作方式类似于StAX。它允许用户的应用程序代码从解析器中获取事件,这与SAX解析器自动将事件推入处理程序相反。
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。

【iOS】实现XML解析的几种技术(参考IT大牛的经验)
读写XML文档的两种模式:SAX和DOM。

1.SAX是一种基于事件驱动的解析模式。解析XML的时候,程序从上到下读取XML文档,如果遇到开始标签、结束标签、属性等,就会触发相应的事件。

优点:解析速度快,iOS重点推荐使用SAX模式解析
缺点:只能读取XML文档,不能写入XML文档
2.DOM模式是将XML文档作为一颗树状结构进行分析,提供获取节点的内容,以及相关属性,或是新增、删除和修改节点的内容。XML解析器在加载XML文件以后,DOM将XML文件的元素视为一个树状结构的节点,一次性读入到内存中。

优点:能够修改XML文档
缺点:如果文档比较大,解析速度就会变慢
NSXML是iOS SDK自带的,也是苹果默认的解析框架,采用SAX模式解析,它是SAX解析模式的代表。本文主要介绍采用NSXML解析XML文件。

2017-02-17 23:34:20 qq_32904839 阅读数 132
  • XML编程

    在现代的开发之中,XML技术无处不在,在各个开发框架中,也都到处充斥着XML配置文件的身影。本课程将为读者讲解XML的产生背景,并且详细分析了HTML与XML的区别、XML核心语法,重点在于XML的解析技术(DOM、SAX、DOM4J工具),同时讲解了如何在HTML页面利用JavaScript进行DOM解析实现页面动态开发。官方QQ群:612148723。

    4174 人正在学习 去看看 李兴华

XML在各种开发中都广泛应用,Android也不例外。作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。在Android中,常见的XML解析器分别为DOM解析器、SAX解析器和PULL解析器。

DOM解析器:

Android完全支持DOM 解析。利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。
DOM的工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档——这就是DOM的工作原理。

SAX解析器

SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
SAX的工作原理:SAX的工作原理简单地说就是对文档进行顺序扫描,

PULL解析器

PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。
PULL 的工作原理:XML pull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parser.nextText从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument事件。

解析实例:
1.通过一个局域网中的服务器中获取一个xml文件

     URL url=new URL("http://192.168.43.85:8080/test.xml");
            HttpURLConnection  connection= (HttpURLConnection) url.openConnection();
            //设置请求方式‘
            connection.setRequestMethod("GET");
            //设置请求连接超时的时间(优化)
            connection.setConnectTimeout(5000);
            //获得请求返回的结果码(200表示获取成功)
            int code=connection.getResponseCode();
                 //获取服务器返回过来的结果
                 InputStream is=connection.getInputStream();       

2.解析

// Dome解析:
      DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
      DocumentBuilder documentBuilder =documentBuilderFactory.newDocumentBuilder();
           Document  document=documentBuilder.parse(is);
           //获取根标签
           Element root=document.getDocumentElement();
            //获取<persons>下面的所有的子标签<person>
           NodeList  nodeList=root.getElementsByTagName("person");
                    for (int i = 0; i <nodeList.getLength() ; i++) {
                        Element personelement= (Element) nodeList.item(i);
                        //获取<person>属性id的值
                        String id=personelement.getAttribute("id");
                        Log.i("ssss",id);
                        获取<person>下面的子标签的内容
                        Element nameElement= (Element) personelement.getElementsByTagName("name").item(0);
                        String name=nameElement.getTextContent();
                        Log.i("ssss",name);
                        Element ageElement= (Element) personelement.getElementsByTagName("age").item(0);
                        String age=ageElement.getTextContent();
                        Log.i("ssss",age);
                        Element imageElement= (Element) personelement.getElementsByTagName("image").item(0);
                        String image=imageElement.getTextContent();
                        Log.i("ssss",image);
//SAX解析
                    SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
                    SAXParser saxParser=saxParserFactory.newSAXParser();
                    saxParser.parse(is,new DefaultHandler(){
                        @Override
                        public void startDocument() throws SAXException {
                            super.startDocument();
                        }

                        @Override
                        public void endDocument() throws SAXException {
                            super.endDocument();
                        }

                        @Override
                        public void endElement(String uri, String localName, String qName) throws SAXException {
                            super.endElement(uri, localName, qName);
                            CuurentTag=null;
                        }

                        @Override
                        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                            super.startElement(uri, localName, qName, attributes);
                            CuurentTag=localName;
                            if("person".equals(localName)){
                                //取属性的值
                                String id=attributes.getValue(0);
                                Log.i("ssss",id);
                            }
                        }
                        @Override
                        public void characters(char[] ch, int start, int length) throws SAXException {
                            super.characters(ch, start, length);
                            //分别获取name、age、image标签的值
                            if("name".equals(CuurentTag)){
                                String name=new String(ch,start,length);
                                Log.i("ssss",name);
                            }else if("age".equals(CuurentTag)){
                                String age=new String(ch,start,length);
                                Log.i("ssss",age);
                            }else if("image".equals(CuurentTag)){
                                String image=new String(ch,start,length);
                                Log.i("ssss",image);
                            }
                        }
                    });
//PULL解析
                    XmlPullParser xmlPullParser= Xml.newPullParser();
                    //设置编码
                    xmlPullParser.setInput(is,"UTF-8");
                    //获取解析的标签的类型
                    int  type=xmlPullParser.getEventType();
                    while(type!=XmlPullParser.END_DOCUMENT){
                        switch (type){
                            case XmlPullParser.START_TAG:
                                String startTAGName=xmlPullParser.getName();
                                if("person".equals(startTAGName)){
                                    String id=xmlPullParser.getAttributeValue(0);
                                    Log.i("ssss",id);
                                }else if("name".equals(startTAGName)){
                                    String name=xmlPullParser.nextText();
                                    Log.i("ssss",name);
                                }else if("age".equals(startTAGName)){
                                    String age=xmlPullParser.nextText();
                                    Log.i("ssss",age);
                                }else if("image".equals(startTAGName)){
                                    String image=xmlPullParser.nextText();
                                    Log.i("ssss",image);
                                }
                                break;
                            case XmlPullParser.END_TAG:
                                break;
                        }
                        type=xmlPullParser.next();
                    }
2019-06-10 11:32:49 qq_34368586 阅读数 76
  • XML编程

    在现代的开发之中,XML技术无处不在,在各个开发框架中,也都到处充斥着XML配置文件的身影。本课程将为读者讲解XML的产生背景,并且详细分析了HTML与XML的区别、XML核心语法,重点在于XML的解析技术(DOM、SAX、DOM4J工具),同时讲解了如何在HTML页面利用JavaScript进行DOM解析实现页面动态开发。官方QQ群:612148723。

    4174 人正在学习 去看看 李兴华

XML在Android系统中可不仅仅是Java的一个布局文件、配置列表。在Android开发者的手上,它甚至可以变成一张画、一幅图、Android的开发者给XML提供了几个强大的技能来帮助我们实现这一功能。

一、Bitmap

在XML中使用Bitmap非常简单,代码如下所示。

<?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@mipmap/ic_launcher">

    </bitmap>

通过这样引用图片,就可以将图片转换成了Bitmap让我们在程序中使用。

二、Shape

通过Shape可以在XML中绘制各种形状,下面展示了Shape所支持参数。

<shape xmlns:android="http://schemas.android.com/apk/res/android"

    //默认为rectangle
    android:shape=["rectangle"|"oval"|"line"|"ring"]>
    
    <corners   /当shape="rectangle"时使用
        //半径,会后面的单个半径属性覆盖,默认为1dp

        android:radius="integer"
        android:topLeftRadius="integer"
        android:topRightRadius="integer"
        android:bottomLeftRadius="integer"
        android:bottomRightRadius="integer"
        ></corners>

    <gradient  //渐变
        android:angle="integer"
        android:centerX="integer"
        android:centerY="integer"
        android:centerColor="integer"
        android:endColor="color"
        android:gradientRadius="integer"
        android:startColor="color"
        android:type=["linear"|"radial"|"sweep"]
        android:useLevel=["true"|"false"]
        ></gradient>

    <padding
        android:left="integer"
        android:top="integer"
        android:right="integer"
        android:bottom="integer"
        ></padding>

    <size  //指定大小,一般用在imageview配合scaleType属性使用
        android:width="integer"
        android:height="integer"
        ></size>

    <solid  //填充颜色
        android:color="color"
        ></solid>

    <stroke  //指定边框
        android:width="integer"
        android:color="color"
        //虚线宽度
        android:dashWidth="integer"
        //虚线间隔
        android:dashGap="integer"
        ></stroke>

    


</shape>

Shape可以说是XML绘图的精华所在。Shape功能十分强大,无论是扁平化、拟物化、还是渐变,它都能绘制。整个Shape的可用参数,在上面的表中已经举例的很清楚了。大家在使用中,试试相应的属性就能很快掌握。

下面就是一个简单的通过渐变来实现的阴影效果,代码如下,效果如图(1)所示。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"

    >
    <gradient
        android:startColor="#FF5DA2FF"
        android:endColor="#805FBBFF"
        android:angle="45"
        ></gradient>

    <padding
        android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp"
        ></padding>
    <corners android:radius="8dp"></corners>


</shape>

                                                               

                                                                    (1)通过Shape实现阴影效果

三、Layer

Layer是在Photoshop中非常常用的功能。在Android中,同样可以通过Layer来实现类似Photoshop中图层的概念。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:drawable="@mipmap/ic_launcher"
        ></item>

    <item
        android:drawable="@mipmap/ic_launcher"
        android:left="200.0dip"
        android:top="200.0dip"
        android:right="200.0dip"
        android:bottom="200.0dip"
        ></item>

</layer-list>

通过layer、later-list可以很方便地实现Photoshpt中的图层效果,图片依次叠加,效果如图(2)所示。

 

                                                                   

                                                                                      (2)图层效果

四、Selector

Sleector的作用是帮助开发者实现静态图中的事件反馈,通过给不同的事件设置不同的图形,从而在程序中根据用户输入,返回不同的效果。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!--默认时的背景图片-->
    <item
        android:drawable="@drawable/X1">
    </item>
    <!--没有焦点时的背景图片-->
    <item
        android:state_window_focused="false"
        android:drawable="@drawable/X2"
        >
    </item>
    <!--非触摸模式下获取焦点并点击时的背景图片-->
    <item
        android:state_focused="true"
        android:state_pressed="true"
        android:drawable="@drawable/X3"
        >
    </item>
    <!--触摸模式下单击时的背景图片-->
    <item
        android:state_focused="false"
        android:state_pressed="true"
        android:drawable="@drawable/X4"
        >
    </item>
    <!--选中时的图片背景-->
    <item
        android:state_selected="true"
        android:drawable="@drawable/X5"
        >
    </item>
    <!--获得焦点时的图片背景-->
    <item
        android:state_focused="true"
        android:drawable="@drawable/X5"
        >

    </item>


</selector>

这一方法可以帮助开发者迅速制作View的触摸反馈。通过配置不同的触发事件,Selector可以自动选择不同的图片,特别是自定义Button的时候,我们就不用是使用原生Button单调的背景,而使用Selector特别定制过的背景。不用在程序中修改点击的逻辑,就能完美的实现触摸反馈。

通常情况下,上面提到的这些方法都是可以共同作用的。下面这个例子就展示了在一个Selector中使用Shape作为它的Item的例子,实现一个具有点击反馈的效果的、圆角矩形的Selector,代码如下所示。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:state_pressed="true"
        >
        <shape android:shape="rectangle">
            <!--填充的颜色-->
            <solid android:color="#f00"></solid>
            <!--设置按钮的四个圆角半径-->
            <!--android:radius 弧形的半径-->
            <corners android:radius="5dp"></corners>
            <!--padding: Button里面的文字与Button边界的间隔-->
            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"></padding>
        </shape>
    </item>

    <item>
        <shape android:shape="rectangle">
            <!--填充的颜色-->
            <solid android:color="#ffffff"></solid>
            <!--设置按钮的四个圆角半径-->
            <!--android:radius 弧形的半径-->
            <corners android:radius="5dp"></corners>
            <!--padding: Button里面的文字与Button边界的间隔-->
            <padding
                android:bottom="10dp"
                android:left="10dp"
                android:right="10dp"
                android:top="10dp"></padding>

        </shape>

    </item>

</selector>

相信通过这个例子大家不仅可以体会到XML绘图的强大,更可以知道各种绘图方法所用的场景和优缺点。

 

 

 

 

 

 

 

Android-Xml绘图

阅读数 13728

pull读取xml--android

阅读数 10

Android中的各种XML

阅读数 2953

android 如何解析XML

阅读数 219

没有更多推荐了,返回首页