
使用android:clickable="true" 可以设置为true。也可以不再布局文件设置,调用TextView.setOnClickListener()自动设置为true。
最近无意间看到了涉及到跑马灯效果的代码,于是在网上查阅了很多资料,在这里对自己看的一些文章进行一下总结,顺便加上自己的一些体会。让我们一步步逐渐向下。
首先我们要实现走马灯这样一个效果,通常来说都是在TextView这个控件中来实现的,而且其中的文字一定是单行显示,如果多行显示,那走马灯效果
也就失去了存在的意义。另外,在EditText中使用走马灯没有必要,也不合理,实际上对于EditText来说android:ellipsize这个属性只有对于设置在android:hint中的文字
的时候是有用的,而且android:ellipsize="marquee"这个用法不能用在EditText控件上。对于在EditText用户输入的文字,android:ellipsize这个属性没有用处。关于EditText
设置android:ellipsize的相关用法以后再讲,在这里也算留个标记,以防自己忘了。
在TextView中实现我们的走马灯效果,需要两个属性android:singleLine="true",以及android:ellipsize="marquee",我们来看下面的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="100dip"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="走马灯效果的演示"
android:singleLine="true"
android:ellipsize="marquee"/>
</LinearLayout>
运行这段代码之后,我们会发现走马灯效果并没有显示出来,显示出的文字是不动的,实际效果如下:
这其中的原因在于跑马灯效果需要TextVIew获得当前的焦点(focus)。然而对于TextView这个控件来说,他的默认的Clickable,LongClickable,Focusable,
FocusableInTouchMode这四个属性的值都是false,所以跑马灯效果也就不会出来了,即使你用手触摸TextView或者按下手机上的导航按键(现在的手机没这
个东东了都。。。)也是无法显示跑马灯的效果的。
解决这个问题我们就需要让我们的TextView得到焦点,这里主要涉及android:focusable和android:focusableInTouchMode这两个属性,简单来说把这两个属性都设置成
true,那么在运行程序以后跑马灯效果就显示出来了,这里就不再贴这两行代码了。
但是细细品味这两个属性之后发现其中其实还是有一些玄机的:
1.。如果这两个属性设置成android:focusable="true"以及android:focusableInTouchMode="false",那么会发现程序运行之后,走马灯效果没有出现,
这个时候需要用户按下手机或者模拟器上的上下导航键,才能让走马灯的效果出现,这说明android:focusable是针对于手机按键有效的,然而根据api的解释,
android:focusableInTouchMode是根据屏幕触摸决定的。
2。如果这两个属性设置成android:focusable="false"与android:focusableInTouchMode="true",那么无论如何走马灯都出现不了了,就算加上android:clickable="true"
也不行,这说明 android:focusable="true"是android:focusableInTouchMode="true"能有效的先决条件,我推测可能是在源码实现中,android:focusableInTouchMode
的逻辑是嵌套在android:focusable中的,这个有待于以后进一步的研究,路漫漫其修远兮。。。
3。在把这两个属性都设置成true以后,会发现程序运行之后,走马灯效果自动就显现了出来,这说明应用在运行后,会自动地按照某种顺序(在这里应该是自上而下),
寻找第一个android:focusableInTouchMode="true"这个属性有效的第一个控件,当然要使这个属性有效按照前面的讨论android:focusable="true"也必须具备。根据测试,
LinearLayout的Clickable,LongClickable,Focusable,FocusableInTouchMode这四个属性默认也都是false,因此,在上面的例子中TextView就率先获得了焦点,
走马灯也就走了起来了。
附上出处链接:http://www.cnblogs.com/Gaojiecai/archive/2013/06/18/3142783.html
1、含义Popwindow就是Android上自定义的一个d出窗口,是在当前activity的顶部的,可以在任意的位置显示,在显示的时候会阻塞UI线程。
2、构造
Popwindow可以直接通过构造方法获取
new PopupWindow(View contentView,intwidth,intheight,booleanfocusable)
构造方法有很多,但是要确保contentview ,width,hight的设置,否则Popwindow不会显示任何内容
这些参数也都可以单独进行设置,比如 popwindow.setContentView(contentView)
3、解析
popwindow的难点就在于这几个参数的设置,一般容易使人迷惑。
popupWindow1.setFocusable(true)//获取焦点
popupWindow1.setOutsideTouchable(true)//获取外部触摸事件
popupWindow1.setTouchable(true)//能够响应触摸事件
popupWindow1.setBackgroundDrawable(newColorDrawable(0x8f000000))//设置背景
关于背景的设置
popupWindow1.setFocusable(true)//获取焦点
popupWindow1.setOutsideTouchable(true)//获取外部触摸事件
popupWindow1.setTouchable(true)//能够响应触摸事件
//popupWindow1.setBackgroundDrawable(new ColorDrawable(0x8f000000))//设置背景
一般情况,如果前面几个设置都设置为true,而且果设置了背景的话,那么你按back键和点击d窗外的区域能使d窗消失,如果不设置背景的话,则不会有这样的效果,即使你设置了popupWindow.setOutsideTouchable(true)。
那么这是为什么呢?别人这里已经有完整的解答,就不再赘述了。
详情见: http://www.cnblogs.com/mengdd/p/3569127.html
关于touchable的设置
首先,我们要明确一点,点击到d窗上的touch事件是首先传递到d窗上的,如果你设置了touchable为true,那么当前d窗则会消耗掉touch事件,当前的activity则不会再收到touch事件,反之则会收到事件。
关于focusable的设置
foucsable设置为true,d窗在d出后就获取到了焦点,焦点的获取,就告诉设备,外部按键事件向哪里传递。如果d窗获取到了焦点,此时点击外部按键,按键事件是直接传递给d窗的。需要注意的是设置focusable为true,并不代表这个控件就获取到了焦点,而是表示可以获取焦点。
popupWindow1.setFocusable(false)//获取焦点
popupWindow1.setOutsideTouchable(true)//获取外部触摸事件
popupWindow1.setTouchable(true)//能够响应触摸事件
popupWindow1.setBackgroundDrawable(newColorDrawable(0x8f000000))//设置背景
这也就解释了,按照上述设置,当你按back键的时候,并不是想象中的popwindow消失,因为d窗并没有获取到焦点,按键事件直接传递到当前activity了。
popupWindow1.setFocusable(true)//获取焦点
popupWindow1.setOutsideTouchable(true)//获取外部触摸事件,设置false也是一样的效果
popupWindow1.setTouchable(true)//能够响应触摸事件
// popupWindow1.setBackgroundDrawable(new ColorDrawable(0x8f000000))//设置背景
当focusable为true后,感觉d窗影响的区域是整个屏幕(猜测),这么猜测是有根据的,因为这时候点击d窗内和d窗外感觉是一样的,d窗的contentview都会收到同样的事件序列,所以这时候,你就会发现setOutsideTouchalbe并没有什么用。此时,如果touchable为true,一般情况下,无论点击的是d窗内还是外,当前的activity是收不到任何touch事件的,这也印证了我的猜测。
popupWindow1.setFocusable(true)//获取焦点
popupWindow1.setOutsideTouchable(true)//获取外部触摸事件
popupWindow1.setTouchable(false)//能够响应触摸事件
popupWindow1.setBackgroundDrawable(new ColorDrawable(0x8f000000))//设置背景
当你如上述设置的话,点击d窗外和点击d窗内都会使得d窗消失,因为d窗内外都是一样的效果,而d窗又没有消耗事件的话(setTouchable为false),事件首先传递到d窗,类型是MotionEvent.ACTION_OUTSIDE,此时如果没有设置背景的话,事件将会传递到activity中。如果setTouchable为true的话,那么传递到d窗的事件类型就是普通类型,而且怎么都不会传递到activity中去。
popupWindow1.setFocusable(true)//获取焦点
popupWindow1.setOutsideTouchable(false)//获取外部触摸事件
popupWindow1.setTouchable(false)//能够响应触摸事件
popupWindow1.setBackgroundDrawable(newColorDrawable(0x8f000000))//设置背景
当然,如果你如上述那样设置,那么d窗是不会收到任何touch事件的,因为系统判断你都设置false了,就是说不需要了,因此就不会发touch事件给这个d窗
popupWindow1.setFocusable(false)//获取焦点
popupWindow1.setOutsideTouchable(true)//获取外部触摸事件
popupWindow1.setTouchable(true)//能够响应触摸事件
popupWindow1.setBackgroundDrawable(newColorDrawable(0x8f000000))//设置背景
如果你设置f ocusable为false的话,那么d窗影响的区域就是你看到的d窗内,按上图设置,点击外部区域,事件首先传递到d窗,类型是MotionEvent.ACTION_OUTSIDE,如果没有设置背景的话,也就是说d窗没有消耗的话,事件会传递到当前的activity中的。
关于OutsideTouchable的设置
OutsideTouchalbe顾名思义,就是指的是外面的事件,在这里,指的就是d窗之外touch事件,比如说,像上述设置就能够点击d窗之外的区域,使得d窗消失。
popupWindow1.setFocusable(false)//获取焦点
popupWindow1.setOutsideTouchable(true)//获取外部触摸事件
popupWindow1.setTouchable(true)//能够响应触摸事件
popupWindow1.setBackgroundDrawable(newColorDrawable(0x8f000000))//设置背景
上图这么设置,点击d窗外部区域能够使得d窗消失,就是因为设置了OutsideTouchalbe为true,导致 事件首先传递到d窗,类型是MotionEvent.ACTION_OUTSIDE。
总结: 设置focusalbe为true,两个效果那么d窗就会获取焦点,就会使得按键事件分发到d窗上;d窗影响的touch事件分发就是整个屏幕,点击d窗内和d窗外传递给d窗的事件序列是一样的
设置背景的话,就等于给d窗加了个外壳,而这个外壳重写了几个方法能够处理回退和一部分touch事件,这也就是设置了背景后,能够点击回退键和d窗外使得d窗消失的原因
设置 touchable为true的话,就表示d窗会消耗掉事件,只要是d窗内的事件都会被消耗掉,包括 focusalbe为true时d窗外的(因为说过,这时候d窗内外是一样的)。
设置OutsideTouchable为true的话,就是表示可以收到外部的事件 MotionEvent.ACTION_OUTSIDE。
注意: 无论怎么设置,只要d窗能够收到touch事件,那么一定是d窗先收到事件,如果d窗消耗掉了,那么当前activity将收不到touch事件
按键事件是向焦点获取的控件分发的
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)