MotionEvent详解

 分类:Android, Java 阅读 (1,143)  No Responses »
10月 092014
 

MotionEvent用来向界面发送鼠标\手写笔\手指或者轨迹球的事件,一般包括硬件的动作类型及一些坐标轴信息。

getPointerCount()
有几个点同时触发了此事件,用于多点触控。

final float getPressure()
第一个触点的压力值(也有可能是任意某个触点)
final float getPressure(int pointerIndex)
返回指定的pointerIndex触点的当前压力值(使用getPointerId(int)来获取此触点的pointerIndex值)

final float getRawX()
Returns the original raw X coordinate of this event.

final float getRawY()
Returns the original raw Y coordinate of this event.

final float getSize(int pointerIndex)
得到触点触摸屏幕的面积值,此值的意义是个相对值,具体计算方法不清楚。(使用getPointerId(int)来获取此触点的pointerIndex值).
final float getSize()
getSize(int) for the first pointer index (may be an arbitrary pointer identifier).

getDownTime()
返回当屏幕刚被按下时的时间(毫秒),按下后移动此时间不变。

final long getEventTime()
返回MotionEvent所在的事件被激发的时间(毫秒),如在OnTouchListener(MotionEvent event)中,每个OnTouch被激发的时间。

3月 302014
 

先在要调试的代码前边的灰色条上点一下,当代码这行变成红色背景时说明断点已经打上了
然后在上面的工具栏中点击绿三角右边的那个带刺的e按钮,这个按钮是以调试模式运行应用
这样就可以了,当代码运行到你设置的断点的时候,就会暂停,这时你就可以开始调试你的代码了

A220C055-FCAE-4FFB-812F-41932236B419

调试app

1月 062014
 

  在使用GridView时我们知道,列数是可以通过设计时的属性来设置的,列的宽度则是根据列数和GridView的宽度计算出来的。但是有些时候我们想实现列数是动态改变的效果,即列的宽度保持某个值,列的数量是可变的,我们可通过获取屏幕宽度并除以项目宽度来处理。请看下面的代码:

  但是由于不同的Android设备可能有不同的宽度,项目宽度乘以获得的列数所得到的总宽度并不能填充整个屏幕的宽度,而给用户带来不好的用户体验,甚至我们可能还需要使行高和列宽保持一定的比例,那么如何动态调整项目的宽度和高度呢?

  我们此处是通过写一个自己的Adapter类,并改写其中的getView函数来实现的,getView是用来返回某个GridView项的部局的函数,我们在此处手动生成需要的view并设置此view的宽度和高度,最后将此view返回。

  注:使用此方法时,项目中的内容可能也需要手动去填充,请再研究

  相关文件及代码如下:

  主窗体只有一个GridView,部局文件代码:

  GridView项所使用的部局文件只有一个TextView,命名为note_item,代码如下:

  Activity类的实现代码如下:

 

1月 012014
 

  1. 使用selector和图片设置Button的样式

  selector是一个设置view样式的集合,通过它可以对各种view的各种状态设置不同的样式。比如在此设置当按钮在正常或者按下状态或者获取焦点时的背景图片。话不多说,下面说说如何通过selector来实现。

  首先我们要准备几张图片,用以标示在按钮的不同状态。本人没有把全部状态的图片全部实现,只实现了正常、按下、获得焦点和不可用几个状态的,图片如下。用PS随便做的图片,显示效果可能不是太好,只是演示用。将几个图片拷到项目下的res->drawable目录中备用。

  有了图片后我们就可以写selector了,在项目->res->drawable上右键,选择菜单New->Other,在弹出的窗口中选择Android XML File,点击下一步,在Root Element列表中选择selector,File右边输入要创建文件的名字,我们这里就叫做graphic_button,点击完成按钮结束,这时我们就能在编辑器中看一个以<selector>节点为根节点的xml文件,现在我们可以为selector加item子节点了,下面把加好子节点的xml直接贴上来了。

  其中第一行,无任何状态的是正常状态下的背景图片

  • state_pressed是当按钮按下时,比如在屏幕上触摸该按钮时,要显示的背景图片。
  • state_focused是当按钮获得焦点时,按钮被高亮显示时,要显示的背景图片。
  • state_enabled其值为false是当按钮不可用时要显示的背景图片
  • state_selected当按钮是否为被选择状态时
  • state_checkable只有当按钮可以进行可选和不可选状态的切换时才会用到此状态
  • state_checked当按钮可选,并且按钮被选中或未选中时显示的背景图片
  • state_window_focused 是指当前所在的窗口是否有焦点时要显示的背景图片,比如弹出一个系统消息或者对话框时此窗口是没有焦点的。

  selector准备好了,我们可以设置按钮的背景样式了,不过先别急,为了更好的规划项目,我们还是为按钮创建一个样式来管理吧,打开项目->res->values->style.xml,在<resource>节点中加入如下xml片断

  好,现在我们可以来设置按钮的style属性了,打开部局文件,添加三个按钮,在每个按钮的Style属性中输入@style/GraphicButton,或者直接在部局的xml文件中加入该属性。XML片断如下

  运行程序,点点按钮我们就可以看到效果了。button的属性android:enabled=”false”,focused状态需要代码来实现,有时间的时候再完善一下本演示。

注意:

1. 一定要注意各个状态的顺序,见这篇文章

 

11月 072013
 

  假设我们有一个全局的数组对象,当我们点一下按钮时使数组当前索引加1,然后执行相应的操作,那么我们需要使用if语句来判断当前索引是否已经越界,如果越界则把当前索引置为0。如下所示

  那么不用if语句,我们也可以通过一个简单的运算来避免使用if语句,如下:

 

 Posted by on 2013-11-07

AlertDialog使用总结

 分类:Android, Java 阅读 (1,617)  No Responses »
5月 112013
 

  AlertDialog直接继承自Dialog类,可以用于显示确认提示框或者列表选择框,还可以用于显示有自定义布局的提示框,Android中内置的ProgressDialog、DatePickerDialog和TimePickerDialog都是继承自于该对象。

AlertDialog的创建

  AlertDialog的实例化函数是声明的protected的,所以不能直接通过new AlertDialog(context)来创建,而是要通过它的一个子类Builder来创建,AlertDialog的很多属性也是通过这个builder对象来实现的。

AlertDialog的区域

  AlertDialog从上到下共分3个区域,即标题区、内容区和控制按钮区。

  • 标题区用于显示提示框的标题,给用户简单提示此提示框是什么用途的。我们可以通过builder的setTitle方法来设置标题的内容。
  • 内容区可以放置详细的操作提示、信息提示或者选择列表,也可以使用自定义的Layout显示更为丰富的内容。
  • 按钮区用于放置操作按钮,最多可放置三个按钮,一个确定按钮,一个否定按钮,一个中性按钮,就如Windows程序中常见的“是、否和取消。我们可以通过setPositiveButton、setNegativeButton和setNeutralButton来设置三个按钮的显示内容和点击时的响应函数

在AlertDialog中显示一个选择列表

  AlertDialog.Builder提供了几种方法可以用于在内容区域显示一个可选择的列表框,这几种方法分别是setAdapter、setItems、setSingleChoiceItems、setMultiChoiceItems。

  • setItems(int itemsId, final OnClickListener listener)可以传入一个CharSequence数据或者一个数组资源R.array,但是此方法显示的列表的样式没办法改变,只能使用AlertDialog默认的样式,而且只能显示一列,数据只能是字符串类型。如果给后面的listener传入null值则点击列表的项目后窗口不会自动关闭。
  • setAdapter可以传入一个ListAdapter,开发者可以通过这个ListAdapter对象设计复杂的列表布局,以增加程序的可视化效果。
  • setSingleChoiceItems可以打开一个右侧带单选按钮的提示框,可接受CharSequence数组、资源数组、ListAdapter、Cursor对象,传入CharSequence数组、资源数组时右侧会显示一个单选按钮,传入ListAdapter时右侧无单选按钮,需要自己来实现单选按钮,Cursor未测试。当选择某项时,提示框不会自己关闭,而是要通过返回键或者下面的按钮来关闭提示框。
  • setMultiChoiceItems可以打开一个右侧带复选按钮的提示框,可接受CharSequence数组、资源数组、Cursor对象,不知道为什么没有支持ListAdapter。

AlertDialog中显示自定义部局

  当我们需要一个复杂的提示框的时候,我们可用自定义的Layout来填充到AlertDialog窗口中。这里主要用到的是Builder的setView方法。我们可以先用getLayoutInflater()或者getActivity().getLayoutInflater()来获取一个LayoutInflater对象,然后用View dlgV=inflater.inflate(R.layout.custom_dialog, null);得到一个View对象,然后再用setView方法将自定义部局填充到AlertDialog中。

  虽然我们可以在自定义部局中设计自己的标题和按钮,但我们仍然还可以使用setTitle和setPositiveButton等方法来使用AlertDialog中的标题栏和按钮。

  如果我们想将一个Activity转换成一个Dialog,并不需要再创建一个AlertDialog然后重新实现这些代码,只需要在AndroidManifest.xml中将Activity的Theme设置为Dialog样式的主题即可,如:

AlertDialog内容区域的优先级

  AlertDialog中详细提示信息和选择列表是不能同时显示的,几个方法的优先显示顺序为setMessage、setAdapter、setItems

Activity如何转换成Dialog

  当我们想把一个Activity转换成Dialog时,如果再建立一个AlertDialog或者DialogFragment来实现的话,很多代码都要进行修改,比如DialogFragment需要增加getActivity来实现对Activity的一些方法进行访问,也不支持设计时设置的android:onclick属性,需要在java代码中用setOnClickListener来执行单击事件,这样做起来相当的麻烦。

  那么比较简单的方法就是通过在AndroidManifest.xml中给该Activity设置一个Dialog使用的Theme来进行支持,这样做的缺点是如果使用的不是android的主题则需要自己写一个符合程序的主题。

 如何设置AlertDialog的样式

  我们需要先定义一个样式,在res/values/style.xml中定义一个MyAlertDialog的样式(此方法暂时不可用,设置效果总不是想要的效果,再研究后再发布过来)

  在代码中,创建builder的时候传入这个样式名称,如下:

点击此处下载AlertDialogTest代码

5月 082013
 

  如何使用:在Eclipse中,打开项目下的res\values目录,在values上右键,新建->Other->Android XML File,Resource Type那选择Values,输入文件的名字,如:mycolors,点“确定”,把下面表格中的文字复制到新建的文件中。在设计界面静态调用时为@color/blue,在java代码中为getResources().getColor(R.color.hotpink)

  因为页面复制过去的xml包含中文特殊字符,大家可以点击这里下载此xml文件 mycolors.xml

<?xml version=”1.0″ encoding=”utf-8″ ?>  
<resources>  
<color name=”white”>#ffffff</color><!–白色 –>  
<color name=”ivory”>#fffff0</color><!–象牙色 –>  
<color name=”lightyellow”>#ffffe0</color><!–亮黄色 –>  
<color name=”yellow”>#ffff00</color><!–黄色 –>  
<color name=”snow”>#fffafa</color><!–雪白色 –>  
<color name=”floralwhite”>#fffaf0</color><!–花白色 –>  
<color name=”lemonchiffon”>#fffacd</color><!–柠檬绸色 –>  
<color name=”cornsilk”>#fff8dc</color><!–米绸色 –>  
<color name=”seaShell”>#fff5ee</color><!–海贝色 –>  
<color name=”lavenderblush”>#fff0f5</color><!–淡紫红 –>  
<color name=”papayawhip”>#ffefd5</color><!–番木色 –>  
<color name=”blanchedalmond”>#ffebcd</color><!–白杏色 –>  
<color name=”mistyrose”>#ffe4e1</color><!–浅玫瑰色 –>  
<color name=”bisque”>#ffe4c4</color><!–桔黄色 –>  
<color name=”moccasin”>#ffe4b5</color><!–鹿皮色 –>  
<color name=”navajowhite”>#ffdead</color><!–纳瓦白 –>  
<color name=”peachpuff”>#ffdab9</color><!–桃色 –>  
<color name=”gold”>#ffd700</color><!–金色 –>  
<color name=”pink”>#ffc0cb</color><!–粉红色 –>  
<color name=”lightpink”>#ffb6c1</color><!–亮粉红色 –>  
<color name=”orange”>#ffa500</color><!–橙色 –>  
<color name=”lightsalmon”>#ffa07a</color><!–亮肉色 –>  
<color name=”darkorange”>#ff8c00</color><!–暗桔黄色 –>  
<color name=”coral”>#ff7f50</color><!–珊瑚色 –>  
<color name=”hotpink”>#ff69b4</color><!–热粉红色 –>  
<color name=”tomato”>#ff6347</color><!–西红柿色 –>  
<color name=”orangered”>#ff4500</color><!–红橙色 –>  
<color name=”deeppink”>#ff1493</color><!–深粉红色 –>  
<color name=”fuchsia”>#ff00ff</color><!–紫红色 –>  
<color name=”magenta”>#ff00ff</color><!–红紫色 –>  
<color name=”red”>#ff0000</color><!–红色 –>  
<color name=”oldlace”>#fdf5e6</color><!–老花色 –>  
<color name=”lightgoldenrodyellow”>#fafad2</color><!–亮金黄色 –>  
<color name=”linen”>#faf0e6</color><!–亚麻色 –>  
<color name=”antiquewhite”>#faebd7</color><!–古董白 –>  
<color name=”salmon”>#fa8072</color><!–鲜肉色 –>  
<color name=”ghostwhite”>#f8f8ff</color><!–幽灵白 –>  
<color name=”mintcream”>#f5fffa</color><!–薄荷色 –>  
<color name=”whitesmoke”>#f5f5f5</color><!–烟白色 –>  
<color name=”beige”>#f5f5dc</color><!–米色 –>  
<color name=”wheat”>#f5deb3</color><!–浅黄色 –>  
<color name=”sandybrown”>#f4a460</color><!–沙褐色 –>  
<color name=”azure”>#f0ffff</color><!–天蓝色 –>  
<color name=”honeydew”>#f0fff0</color><!–蜜色 –>  
<color name=”aliceblue”>#f0f8ff</color><!–艾利斯兰 –>  
<color name=”khaki”>#f0e68c</color><!–黄褐色 –>  
<color name=”lightcoral”>#f08080</color><!–亮珊瑚色 –>  
<color name=”palegoldenrod”>#eee8aa</color><!–苍麒麟色 –>  
<color name=”violet”>#ee82ee</color><!–紫罗兰色 –>  
<color name=”darksalmon”>#e9967a</color><!–暗肉色 –>  
<color name=”lavender”>#e6e6fa</color><!–淡紫色 –>  
<color name=”lightcyan”>#e0ffff</color><!–亮青色 –>  
<color name=”burlywood”>#deb887</color><!–实木色 –>  
<color name=”plum”>#dda0dd</color><!–洋李色 –>  
<color name=”gainsboro”>#dcdcdc</color><!–淡灰色 –>  
<color name=”crimson”>#dc143c</color><!–暗深红色 –>  
<color name=”palevioletred”>#db7093</color><!–苍紫罗兰色 –>  
<color name=”goldenrod”>#daa520</color><!–金麒麟色 –>  
<color name=”orchid”>#da70d6</color><!–淡紫色 –>  
<color name=”thistle”>#d8bfd8</color><!–蓟色 –>  
<color name=”lightgray”>#d3d3d3</color><!–亮灰色 –>  
<color name=”lightgrey”>#d3d3d3</color><!–亮灰色 –>  
<color name=”tan”>#d2b48c</color><!–茶色 –>  
<color name=”chocolate”>#d2691e</color><!–巧可力色 –>  
<color name=”peru”>#cd853f</color><!–秘鲁色 –>  
<color name=”indianred”>#cd5c5c</color><!–印第安红 –>  
<color name=”mediumvioletred”>#c71585</color><!–中紫罗兰色 –>  
<color name=”silver”>#c0c0c0</color><!–银色 –>  
<color name=”darkkhaki”>#bdb76b</color><!–暗黄褐色 –>  
<color name=”rosybrown”>#bc8f8f</color><!–褐玫瑰红 –>  
<color name=”mediumorchid”>#ba55d3</color><!–中粉紫色 –>  
<color name=”darkgoldenrod”>#b8860b</color><!–暗金黄色 –>  
<color name=”firebrick”>#b22222</color><!–火砖色 –>  
<color name=”powderblue”>#b0e0e6</color><!–粉蓝色 –>  
<color name=”lightsteelblue”>#b0c4de</color><!–亮钢兰色 –>  
<color name=”paleturquoise”>#afeeee</color><!–苍宝石绿 –>  
<color name=”greenyellow”>#adff2f</color><!–黄绿色 –>  
<color name=”lightblue”>#add8e6</color><!–亮蓝色 –>  
<color name=”darkgray”>#a9a9a9</color><!–暗灰色 –>  
<color name=”darkgrey”>#a9a9a9</color><!–暗灰色 –>  
<color name=”brown”>#a52a2a</color><!–褐色 –>  
<color name=”sienna”>#a0522d</color><!–赭色 –>  
<color name=”darkorchid”>#9932cc</color><!–暗紫色 –>  
<color name=”palegreen”>#98fb98</color><!–苍绿色 –>  
<color name=”darkviolet”>#9400d3</color><!–暗紫罗兰色 –>  
<color name=”mediumpurple”>#9370db</color><!–中紫色 –>  
<color name=”lightgreen”>#90ee90</color><!–亮绿色 –>  
<color name=”darkseagreen”>#8fbc8f</color><!–暗海兰色 –>  
<color name=”saddlebrown”>#8b4513</color><!–重褐色 –>  
<color name=”darkmagenta”>#8b008b</color><!–暗洋红 –>  
<color name=”darkred”>#8b0000</color><!–暗红色 –>  
<color name=”blueviolet”>#8a2be2</color><!–紫罗兰蓝色 –>  
<color name=”lightskyblue”>#87cefa</color><!–亮天蓝色 –>  
<color name=”skyblue”>#87ceeb</color><!–天蓝色 –>  
<color name=”gray”>#808080</color><!–灰色 –>  
<color name=”grey”>#808080</color><!–灰色 –>  
<color name=”olive”>#808000</color><!–橄榄色 –>  
<color name=”purple”>#800080</color><!–紫色 –>  
<color name=”maroon”>#800000</color><!–粟色 –>  
<color name=”aquamarine”>#7fffd4</color><!–碧绿色 –>  
<color name=”chartreuse”>#7fff00</color><!–黄绿色 –>  
<color name=”lawngreen”>#7cfc00</color><!–草绿色 –>  
<color name=”mediumslateblue”>#7b68ee</color><!–中暗蓝色 –>  
<color name=”lightslategray”>#778899</color><!–亮蓝灰 –>  
<color name=”lightslategrey”>#778899</color><!–亮蓝灰 –>  
<color name=”slategray”>#708090</color><!–灰石色 –>  
<color name=”slategrey”>#708090</color><!–灰石色 –>  
<color name=”olivedrab”>#6b8e23</color><!–深绿褐色 –>  
<color name=”slateblue”>#6a5acd</color><!–石蓝色 –>  
<color name=”dimgray”>#696969</color><!–暗灰色 –>  
<color name=”dimgrey”>#696969</color><!–暗灰色 –>  
<color name=”mediumaquamarine”>#66cdaa</color><!–中绿色 –>  
<color name=”cornflowerblue”>#6495ed</color><!–菊兰色 –>  
<color name=”cadetblue”>#5f9ea0</color><!–军兰色 –>  
<color name=”darkolivegreen”>#556b2f</color><!–暗橄榄绿 –>  
<color name=”indigo”>#4b0082</color><!–靛青色 –>  
<color name=”mediumturquoise”>#48d1cc</color><!–中绿宝石 –>  
<color name=”darkslateblue”>#483d8b</color><!–暗灰蓝色 –>  
<color name=”steelblue”>#4682b4</color><!–钢兰色 –>  
<color name=”royalblue”>#4169e1</color><!–皇家蓝 –>  
<color name=”turquoise”>#40e0d0</color><!–青绿色 –>  
<color name=”mediumseagreen”>#3cb371</color><!–中海蓝 –>  
<color name=”limegreen”>#32cd32</color><!–橙绿色 –>  
<color name=”darkslategray”>#2f4f4f</color><!–暗瓦灰色 –>  
<color name=”darkslategrey”>#2f4f4f</color><!–暗瓦灰色 –>  
<color name=”seagreen”>#2e8b57</color><!–海绿色 –>  
<color name=”forestgreen”>#228b22</color><!–森林绿 –>  
<color name=”lightseagreen”>#20b2aa</color><!–亮海蓝色 –>  
<color name=”dodgerblue”>#1e90ff</color><!–闪兰色 –>  
<color name=”midnightblue”>#191970</color><!–中灰兰色 –>  
<color name=”aqua”>#00ffff</color><!–浅绿色 –>  
<color name=”cyan”>#00ffff</color><!–青色 –>  
<color name=”springgreen”>#00ff7f</color><!–春绿色 –>  
<color name=”lime”>#00ff00</color><!–酸橙色 –>  
<color name=”mediumspringgreen”>#00fa9a</color><!–中春绿色 –>  
<color name=”darkturquoise”>#00ced1</color><!–暗宝石绿 –>  
<color name=”deepskyblue”>#00bfff</color><!–深天蓝色 –>  
<color name=”darkcyan”>#008b8b</color><!–暗青色 –>  
<color name=”teal”>#008080</color><!–水鸭色 –>  
<color name=”green”>#008000</color><!–绿色 –>  
<color name=”darkgreen”>#006400</color><!–暗绿色 –>  
<color name=”blue”>#0000ff</color><!–蓝色 –>  
<color name=”mediumblue”>#0000cd</color><!–中兰色 –>  
<color name=”darkblue”>#00008b</color><!–暗蓝色 –>  
<color name=”navy”>#000080</color><!–海军色 –>  
<color name=”black”>#000000</color><!–黑色 –>  
</resources>  
4月 172013
 

 

其他注意事项:

1、如何设置自己的Dialogfragment没有标题栏?
可以通过两种方法来设置 ,一种是使用dialogfragment的setStyle函数,另外就是使用getDialog().getWindow().requestFeature方法,具体代码如下

使用getDialog的方法

2. The method show(FragmentManager, String) in the type DialogFragment is not applicable for the arguments (FragmentManager, String)

此问题常是由于你所自定义的DialogFragment子类继承自android.app.dialogfragment,而非继承自android.support.v4.app.DialogFragment,解决办法就是将你的自定义的DialogFragment子类继承自android.support.v4.app.DialogFragment。如下所示:

 

3月 222013
 

When we begin to run a android application, eclipse sometimes gives an “The connection to adb is down” error, just like below message.

[2013-03-22 22:08:02 – testapp] The connection to adb is down, and a severe error has occured.
[2013-03-22 22:08:02 – testapp] You must restart adb and Eclipse.
[2013-03-22 22:08:02 – testapp] Please ensure that adb is correctly located at ‘E:android-sdkplatform-toolsadb.exe’ and can be executed.

At before, I restart computer to fix the problem. But now, I get a faster solution for this message, copy the adb path in error message, here is “E:android-sdkplatform-toolsadb.exe”, and paste in the address bar of an explorer or paste in the textbox of Run window(press WIN+R key to open it) and press enter button to run adb once. And then eclipse works well.

If this does not work, kill adb.exe process in task manager, and resatrt eclipse.

If the problem is still exist, you should restart your computer.

复制错误信息中adb的路径,在这里是E:android-sdkplatform-toolsadb.exe,然后粘贴到文件夹地址栏或者运行窗口中,执行adb.exe一次即可解决错误。

如果上面这样不行的话,在任务管理器中结束adb.exe,然后重新启动Eclipse.

如果还不行就只能重新启动你的系统了。

 Posted by on 2013-03-22