制作Nine-Patch图片

这是一种被特殊处理过的png图片,能够指定哪些区域可以被拉伸而哪些区域不可以

比如有这样一张图

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.uibestpractice.MainActivity" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/you"></LinearLayout></RelativeLayout>

它就变成了这样

可以看到,由于图片的宽高不足以填满整个屏幕的宽度,整张图片被均匀地拉伸了,这种效果非常差

这时我们就可以使用Nine-Patch图片来进行改善

在Android sdk目录下有一个tools文件夹,在这个文件夹中找到draw9patch.bat文件,我们就是使用它来制作Nine-Patch图片的

使用点九图片的效果

编写一个简易的聊天界面

<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:background="#d8e0e8"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.uibestpractice.MainActivity" ><ListViewandroid:id="@+id/msg_list_view"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:divider="#0000" ></ListView><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content" ><EditTextandroid:id="@+id/input_text"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:hint="Type something here"android:maxLines="2" /><Buttonandroid:id="@+id/send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Send" /></LinearLayout></LinearLayout>

这里在主界面中放置了一个ListView用于显示聊天的消息内容,又放置了一个EditText用于输入消息,还放置了一个Button用于发送消息

ListView用到了一个android:divider属性,它可以指定ListView分割线的颜色,这里#0000表示将分割线设为透明色

然后我们来定义一个消息的实体类

新建Msg

public class Msg {public static final int TYPE_RECEIVED = 0;public static final int TYPE_SENT = 1;private String content;private int type;public Msg(String content, int type) {this.content = content;this.type = type;}public String getContent() {return content;}public int getType() {return type;}}

Msg类中只有两个字段,content表示消息的内容,type表示消息的类型

其中消息类型有两个值可选,TYPE_RECEIVED表示这是一条收到的消息,TYPE_SENT表示这是一条发出的消息

接着来编写ListView子项的布局

新建msg_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="10dp" ><LinearLayoutandroid:id="@+id/left_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="left"android:background="@drawable/left" ><TextViewandroid:id="@+id/left_msg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="10dp"android:textColor="#fff" /></LinearLayout><LinearLayoutandroid:id="@+id/right_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="right"android:background="@drawable/right"><TextViewandroid:id="@+id/right_msg"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_margin="10dp"/></LinearLayout></LinearLayout>

这里我们让收到的消息居左对齐,发出的消息居右对齐

怎样才能让收到的消息和发出的消息都放在同一个布局里呢?

只要根据消息的类型来决定隐藏和显示哪种消息就可以了

接下来需要创建ListView的适配器类,让它继承自ArrayAdapter,并将泛型指定为Msg类

新建MsgAdapter

public class MsgAdapter extends ArrayAdapter<Msg> {private int resourceId;public MsgAdapter(Context context, int textViewResourceId, List<Msg> objects) {super(context, textViewResourceId, objects);resourceId = textViewResourceId;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Msg msg = getItem(position);View view;ViewHolder viewHolder;if (convertView == null) {view = LayoutInflater.from(getContext()).inflate(resourceId, null);viewHolder = new ViewHolder();viewHolder.leftLayout = (LinearLayout) view.findViewById(R.id.left_layout);viewHolder.rightLayout = (LinearLayout) view.findViewById(R.id.right_layout);viewHolder.leftMsg = (TextView) view.findViewById(R.id.left_msg);viewHolder.rightMsg = (TextView) view.findViewById(R.id.right_msg);view.setTag(viewHolder);} else {view = convertView;viewHolder = (ViewHolder) view.getTag();}if (msg.getType() == Msg.TYPE_RECEIVED) {// 如果是收到的消息,则显示左边的消息布局,将右边的消息布局隐藏viewHolder.leftLayout.setVisibility(View.VISIBLE);viewHolder.rightLayout.setVisibility(View.GONE);viewHolder.leftMsg.setText(msg.getContent());} else if (msg.getType() == Msg.TYPE_SENT) {// 如果是发出的消息,则显示右边的消息布局,将左边的消息布局隐藏viewHolder.rightLayout.setVisibility(View.VISIBLE);viewHolder.leftLayout.setVisibility(View.GONE);viewHolder.rightMsg.setText(msg.getContent());}return view;}class ViewHolder {LinearLayout leftLayout;LinearLayout rightLayout;TextView leftMsg;TextView rightMsg;}}

getView()方法中增加了对消息类型的判断

如果这条消息是收到的,则显示左边的消息布局,如果这条消息是发出的,则显示右边的消息布局

最后修改MainActivity中的代码,来为ListView初始化一些数据,并给发送按钮加入事件响应

public class MainActivity extends Activity {private ListView msgListView;private EditText inputText;private Button send;private MsgAdapter adapter;private List<Msg> msgList = new ArrayList<Msg>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initMsg(); // 初始化消息数据adapter = new MsgAdapter(MainActivity.this, R.layout.msg_item, msgList);inputText = (EditText) findViewById(R.id.input_text);send = (Button) findViewById(R.id.send);msgListView = (ListView) findViewById(R.id.msg_list_view);msgListView.setAdapter(adapter);send.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String content = inputText.getText().toString();if (!"".equals(content)) {Msg msg = new Msg(content, Msg.TYPE_SENT);msgList.add(msg);adapter.notifyDataSetChanged(); // 当有新消息时,刷新ListView中的显示msgListView.setSelection(msgList.size()); // 将ListView定位到最后一行inputText.setText(""); // 清空输入框的内容}}});}private void initMsg() {Msg msg1 = new Msg("Hello guy.", Msg.TYPE_RECEIVED);msgList.add(msg1);Msg msg2 = new Msg("Hello. Who is that?", Msg.TYPE_SENT);msgList.add(msg2);Msg msg3 = new Msg("This is Tom. Nice talking to you. ", Msg.TYPE_RECEIVED);msgList.add(msg3);}
}

在initMsgs()方法中我们先初始化了几条数据用于在ListView中显示

然后在发送按钮的点击事件里获取了EditText中的内容

如果内容不为空则创建出一个新的Msg对象,并把它添加到msgList列表中去

之后又调用了适配器的notifyDataSetChanged()方法,用于通知列表的数据发生了变化,这样新增的一条消息才能够在ListView中显示

接着调用ListView的setSelection()方法将显示的数据定位到最后一行,以保证一定可以看得到最后发出的一条消息

最后调用EditText的setText()方法将输入的内容清空

源码及图片资源地址https://github.com/LiuchangDuan/uibestpractice

Nine-Patch点九切图法相关推荐

  1. 点“九”切图-教程分享

    用户手中的产品界面,并非设计师呕心沥血创作的效果图,而是一个个单独的切图经由开发同学技术实现.切图作为设计师与开发者之间的桥梁,它的作用很关键,合适的切图.精准的位置可以最大限度的还原效果图的设计,精 ...

  2. android 系统的切图方式_UI设计切图规范

    移动UI设计切图是UI设计师最重要的设计输出物,切图资源输出是否规范直接影响到工程师对设计效果的还原度.设计师的切图输出物是是体现一个设计师专业水准的重要标准,同时也是设计师表达自己对设计态度的最有力 ...

  3. 移动APP界面设计切图指南

    移动APP切图信息图:iOS界面设计切图指南 http://blog.163.com/conghui1986@126/blog/static/5647097520146311247618/ Andro ...

  4. UI实战教程之切图标注篇(UI小白必备)

    UI实战教程之切图标注篇(UI小白必备) 一. 切图工具和标注工具 学会使用工具可以起到事半功倍的效果.在这里为大家推荐我常用的切图和标注工具. 1. 切图工具: (1)Cutterman 这是一款运 ...

  5. ui九宫格切图_【九宫切图】什么是九宫绘图,九宫格绘法

    九宫切图在控件美化的时候会经常的用到 比如: 20140630220626_56850.png (3.13 KB, 下载次数: 42) [九宫切图]什么是九宫绘图,九宫格绘法 2014-7-21 11 ...

  6. 切图小贴士-手机Android平台“点九”的切图

    用户手中看到的产品界面,并非设计师呕心沥血创作的效果图,而是一个个单独的切图经由开发同学技术实现.切图作为设计师与开发者之间的桥梁,它的作用很关键,合适的切图.精准的位置可以最大限度的还原效果图的设计 ...

  7. 手机Android平台“点九”的切图方法

    http://blog.sina.com.cn/s/blog_687bea510101g6dj.html 用户手中看到的产品界面,并非设计师呕心沥血创作的效果图,而是一个个单独的切图经由开发同学技术实 ...

  8. html用九张图片做出九宫图,九宫切图软件 如何快速把照片做成九宫格切图

    在微博时尚流行的图片展示上,九宫切图是当下最流行的一种,一张非常普通的照片经过了九宫切图软件的处理,变成非常漂亮的九宫图片,是不是美观大大提升了.尤其是在把自己自拍的照片做成九宫图展示,让人更有一种不 ...

  9. [Java] Java九格切图 (同样支持四格, 六格, n*n格)

    公司的APP要做一个九格切图功能, 类似朋友圈那种一张大图放上去. 本来已经用Python三十行搞定. 结果被测试部的质疑我不会用Java写?? 一下子脾气就上来了, 用Java写了一个支持N格切图的 ...

最新文章

  1. python pycharm 增量选择 ctrl+w
  2. 阿卡迪亚大学的计算机科学,阿卡迪亚大学计算机科学
  3. boost::fusion::iterator_range用法的测试程序
  4. Filter_细节_过滤器链(多个过滤器)
  5. WampServer下如何实现多域名配置
  6. Frameset导致Cookies和Session丢失的原因及解决办法
  7. Java中方法与数组
  8. 微信小程序实现底部导航栏自定义tabBar
  9. 跟小白学python网络爬虫实例2
  10. 加拿大的计算机技术专业,详解加拿大计算机专业及相关方向
  11. random.seed(0)
  12. 经典SQL Server语句大全(超详细)
  13. linux boot分区创建,Linux 更换 Boot分区 磁盘 示例
  14. 关于魔兽T人和延迟的恶劣挂原理及实现
  15. 列表 元祖 字典
  16. 汽车电子的发展简介和V型开发模式
  17. FinClip程序员生活指南|如何“反脆弱”的过好一个低碳生活
  18. html分享插件,10个jQuery插件分享
  19. 调整el-datetimepicker时间选择器的样式大小
  20. 数据结构c语言版入门教材,《数据结构(C语言版)》C语言-教材-数据结构.pdf

热门文章

  1. applicationContext.xml的头文件
  2. c++的复制省略(copy elision)
  3. 消防工程师 8.4 防排烟系统-联动控制 9. 应急照明和疏散指示系统
  4. 万字长文总结Android多进程,大厂直通车!
  5. Terry-Ye/im 系统使用zookeeper
  6. 计算机为什么无法访问公司共享文件夹,win10系统共享文件夹无法访问的详细方案...
  7. parellels desktop启动虚拟机报“操作失败”
  8. mysql怎么将成绩划分等级_MySQL按等级查询
  9. 明清时期苏州妇女的服饰追求
  10. mac下hadoop环境的搭建