Android控件的尺寸

android开发中,可以通过编写XML格式的布局文件来实现布局,也可以用纯代码进行布局,通常都是选择XML文件布局。在XML布局文件中,与控件的尺寸有关的属性有android:minHeight、android:minWidth、android:layout_weight、android:layout_width等。像layout_width、layout_height既可以指定具体的数值,也可以指定wrap_content、match_parent这样的值,而且有时候得到的与指定的可能不一致,那么控件的尺寸到底怎么确定?查阅Android文档,在类View中可以找到这么一段话:

The size of a view is expressed with a width and a height. A view actually possess two pairs of width and height values.

The first pair is known as measured width and measured height. These dimensions define how big a view wants to be within its parent (see Layout for more details.) The measured dimensions can be obtained by callinggetMeasuredWidth()andgetMeasuredHeight().

The second pair is simply known as width and height, or sometimes drawing width and drawing height. These dimensions define the actual size of the view on screen, at drawing time and after layout. These values may, but do not have to, be different from the measured width and height. The width and height can be obtained by callinggetWidth()andgetHeight().

也就是说,一个View实际有两个尺寸,一个是它想要的尺寸,一个是它实际上的尺寸。一个View的onDraw方法被调用前,会调用onMeasure (int widthMeasureSpec, int heightMeasureSpec)方法来得到一个想要的尺寸。如果没有指定尺寸相关的属性,也没有重写onMeasure方法,默认的尺寸是100x100.在onMeasure方法中,必须调用setMeasuredDimension(int, int)方法来设定测量好的宽高值。具体更详细的用法以及各个参数的含义可以查阅文档,这里给一个简单的重写示例:

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int wMode = MeasureSpec.getMode(widthMeasureSpec);

int hMode = MeasureSpec.getMode(heightMeasureSpec);

if (wMode == MeasureSpec.AT_MOST)

mWidth = MeasureSpec.getSize(widthMeasureSpec);

else

mWidth = 320;

if (hMode == MeasureSpec.AT_MOST)

mHeight = MeasureSpec.getSize(heightMeasureSpec);

else

mHeight = 240;

this.setMeasuredDimension(mWidth, mHeight);

}

至于为什么实际尺寸与测量的尺寸往往不一致,官方文档解释,在测量的时候,把控件间的padding也计算在内了,而实际尺寸是不会包含padding的。

最后,贴一张网上扒来的图,这张图很好地揭示了控件的绘制过程:

参考文章:

Http文件上传

在android开发中,需要将文件上传到服务器。传文件写个简单的socket当然也能搞定,但是让功能强大的服务器跑一个自己写的低端socket server岂不是笑话,乖乖使用现成的服务器程序吧。发现http协议支持文件上传,于是事情就简单多了,查了些资料,抄了份servlet代码又简单改了改,跑在了tomcat上:

import java.io.File;

import java.io.IOException;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileItemFactory;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.xxx.config.PathConfig;     //这个类里有一些静态的路径配置信息

/**

* Servlet implementation class FileUpload

*/

@WebServlet(description = "A servelt for uploading files", urlPatterns = {

"/FileUpload", "/upload" })

public class FileUpload extends HttpServlet {

private static final long serialVersionUID = 1L;

/**

* @see HttpServlet#HttpServlet()

*/

public FileUpload() {

super();

// TODO Auto-generated constructor stub

}

/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse

*      response)

*/

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

if (isMultipart) {

FileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

try {

List items = upload.parseRequest(request);

for (FileItem item : items) {

if (!item.isFormField()) {

item.write(new File(PathConfig.UPLOAD_PATH,  //这是我设置的目录

item.getName().substring(

item.getName().lastIndexOf("\\") + 1)));

}

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

这段代码里用到了apache的FileUpload包,然后它自身又需要commons-io.jar,具体下载地址可以在这里找到http://commons.apache.org/proper/commons-fileupload/.

servlet在tomcat上跑起来后,可以写个简单的html页面在本地上测试一下:

File API Demo

action="http://localhost:8080/upload">

Upload File:

至于android上的文件上传客户端……因为我按照参考文章里的第二个方案并没有成功,所以等我解决了神秘的错误再说吧:-)

参考文章:

android上传文件用哪个布局,每周总结20130821——android控件的尺寸、http文件上传...相关推荐

  1. Android 在布局容器中动态添加控件

    这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...

  2. android怎样禁用整个布局点击,Android - 自动禁用布局里的所有子控件

    很久没有写博客了,今天给大家分享一个刚写好的小功能,很实用. 使用场景:禁用布局里所有的子控件,让界面只能看,但不能编辑,如果一个一个控件去设置肯定是很麻烦的,于是想了个好方法.可根据需要扩展更多控件 ...

  3. Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸

    Android 屏幕适配攻略(二)单位dp与px来表示控件的尺寸 在安卓中,将屏幕密度分为了五类 屏幕密度 对应的标签 对应的像素 120dip ldpi 1dp= 0.75px 160dip mdp ...

  4. 使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容

    第一次在CNBlogs上发Post是提出一个有关使用WebBrowser控件时对SELECT网页元素操作的疑惑,这个问题至今也没有解决,后来有朋友在该Post的评论里询问WebBrowser控件如何在 ...

  5. VB控件注册 - 利用资源文件将dll、ocx打包进exe文件

    很多时候自定义或者引用控件都需要注册才能使用,但是如何使要注册的dll或ocx打包到exe中,使用户下载以后看到     现在介绍一下使用资源文件,将dll.ocx打包进exe,点击直接注册的例子: ...

  6. winform界面嵌入dwg图纸_WPF中使用WinForm控件预览DWG文件(学习笔记)

    操作环境:XP,C# ,.Net4.0和VS2010中测试 WinForm中使用DWGThumbnail不用这么麻烦,下面讨论的是在WPF中使用,WPF中无法直接引用DWGThumbnail.ocx来 ...

  7. java保存文件filedialog保存路径 文件名_Winform控件SaveFileDialog用于保存文件

    SaveFileDialog用于保存文件,供大家参考,具体内容如下 1.新建Winform窗体应用程序,命名为SaveFileDialogDemo. 2.在界面上添加一个按钮的控件(用于打开保存文件对 ...

  8. VB.NET引入edrawings控件实现solidworks等文件预览

    VB.NET引入edrawings控件实现solidworks等文件预览 1.准备要引用的控件文件 eDrawingHostControl.dll EModelView.dll 控件文件 2.启动vi ...

  9. 如何利用Flash控件捕获到swf文件的每一帧数据?

    如何利用Flash控件捕获到swf文件的每一帧数据? 最近工作因为需要将swf转换成视频,开始想要从swf文件格式着手,解析出swf里面的图像,了解过swf文件格式后,发现是个复杂的工作,因此放弃这个 ...

最新文章

  1. cogs 539. 牛棚的灯
  2. 添加请求头 retrofit_Python爬虫偷懒神器 — 快速构造请求头!
  3. Kubernetes1.5新特性(一):Kubelet API增加认证和授权能力
  4. openjdk-alpine镜像无法打印线程堆栈和内存堆栈问题
  5. 为什么在Python里推荐使用多进程而不是多线程?(为什么python多线程无法增加CPU使用率?)...
  6. 3DSlicer18:Layouts
  7. VBA遍历文件夹下文件文件实用源码
  8. 用一个参数化的模型来投影点
  9. 360发声明要求腾讯向6亿QQ注册用户道歉
  10. 能看懂vue源码什么水平_送你 Vue 学习路线的最佳实践
  11. JAVA高并发工作笔记0002---高并发编程之使用ThreadFactory来创建新的线程
  12. shell waite php,linux shell wait命令详解
  13. gcn在图像上的应用_使用图卷积网络(GCN)做图像分割
  14. PHP 入门学习教程及进阶(源于知乎网友的智慧)
  15. mcgs组态软件中字体如果从左到右变化_在MCGS嵌入版组态软件中,可以利用大小变化来实现动画效果。( )...
  16. 怎样将网络机顶盒usb调试模式打开
  17. css实现椭圆绕圈动画
  18. linux使用tab键联想,Linux 下python 如何设置使用tab键
  19. excel文件被写保护怎么解除_实用解除常用文件word、excel的写保护
  20. python打印输出数组中的所有元素

热门文章

  1. 练手级计算机,快来打怪
  2. how tomcat works 读书笔记(一)----------一个简单的webserver
  3. 轻松搞定ServerCore初始设置
  4. 有意思的《致招商银行的公开信》行动!
  5. 1046. 最后一块石头的重量
  6. Baidu-Rpc中Pb结构转为Json
  7. Python入门教程丨1300多行代码,让你轻松掌握基础知识点
  8. python及拓展版_python扩展模块
  9. canvas 画点_css+canvas 随便画一个星空
  10. nodejs linux复制文本,Nodejs 复制文件/文件夹的方法