怎样设置一个imageview 长按事件的点击事件

下次自动登录
现在的位置:
& 综合 & 正文
Android–用手指移动画面里的照片/onTouchEvent事件判断
这个实现的是,拖动画面上的图片,图片会随着你的手到哪图片到哪。
下面给出这个程序的实现:
public class EX07_04 extends Activity {
/*宣告ImageView变量*/
private ImageView mImageView01;
/*宣告相关变量作为储存图片宽高,位置使用*/
private int intWidth, intHeight, intDefaultX, intDefaultY;
private float mX, mY;
/*宣告储存屏幕的分辨率变量 */
private int intScreenX, intScreenY;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 取得屏幕对象 */
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
/* 取得屏幕解析像素 */
intScreenX = dm.widthP
intScreenY = dm.heightP
/* 设定图片的宽高 */
intWidth = 100; intHeight = 100;
/*透过findViewById建构子建立ImageView对象*/
mImageView01 =(ImageView) findViewById(R.id.myImageView1);
/*将图片从Drawable指派给ImageView来呈现*/
mImageView01.setImageResource(R.drawable.baby);
/* 初始化按钮位置置中 */ RestoreButton();
/* 当按下ImageView,还原初始位置 */
mImageView01.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) { RestoreButton();
/*覆写触控事件*/
public boolean onTouchEvent(MotionEvent event) {
/*取得手指触控屏幕的位置*/
float x = event.getX();
float y = event.getY();
/*触控事件的处理*/
switch (event.getAction()) {
/*点选屏幕*/
case MotionEvent.ACTION_DOWN:
picMove(x, y);
/*移动位置*/
case MotionEvent.ACTION_MOVE:
picMove(x, y);
/*离开屏幕*/
case MotionEvent.ACTION_UP:
picMove(x, y);
}catch(Exception e) {
e.printStackTrace();
/*移动图片的方法*/
private void picMove(float x, float y) {
/*默认微调图片与指针的相对位置*/
mX=x-(intWidth/2);
mY=y-(intHeight/2);
/*防图片超过屏幕的相关处理*/
/*防止屏幕向右超过屏幕*/
if((mX+intWidth)&intScreenX) {
mX = intScreenX-intW
/*防止屏幕向左超过屏幕*/
else if(mX&0) {
/*防止屏幕向下超过屏幕*/
else if ((mY+intHeight)&intScreenY) {
mY=intScreenY-intH
/*防止屏幕向上超过屏幕*/
else if (mY&0) {
/*透过log 来检视图片位置*/
Log.i("jay", Float.toString(mX)+","+Float.toString(mY));
/* 以setLayoutParams方法,重新安排Layout上的位置 */
mImageView01.setLayoutParams (
new AbsoluteLayout.LayoutParams (intWidth,intHeight,(int) mX,(int)mY) );
/* 还原ImageView位置的事件处理 */
public void RestoreButton() {
intDefaultX = ((intScreenX-intWidth)/2);
intDefaultY = ((intScreenY-intHeight)/2);
/*Toast还原位置坐标*/
mMakeTextToast ( "("+ Integer.toString(intDefaultX)+ ","+ Integer.toString(intDefaultY)+")",
/* 以setLayoutParams方法,重新安排Layout上的位置 */
mImageView01.setLayoutParams (
new AbsoluteLayout.LayoutParams (intWidth,intHeight,intDefaultX,intDefaultY) );
/*自定义一发出讯息的方法*/
public void mMakeTextToast(String str, boolean isLong) {
if(isLong==true) {
Toast.makeText(EX07_04.this, str, Toast.LENGTH_LONG).show();
Toast.makeText(EX07_04.this, str, Toast.LENGTH_SHORT).show();
Android onTouchEvent,Event Listeners调用机制
在Android平台上,捕获用户在界面上的触发事件有很多种方法,View类就提供这些方法。你在使用各种View视图来布局界面时,会发现几个公用的回调方法来捕捉有用的UI触发事件,当事件在某个View对象上被触发时,这些方法会被系统框架通过这个对象所调用,例如:当一个View(如一个Button)被点击,onTouchEvent()方法会在该对象上被调用,所以,为了捕获和处理事件,必须去继承某个类,并重载这些方法,以便自己定义具体的处理逻辑,显然,你更容易明白,为什么在你使用View类时会嵌套带有这些回调方法的接口类,这些接口称为event
listeners,它是你去获取UI交互事件的工具在你继承View类,以便建立一个自定义组,也许你想继承Button ,
你会更普遍使用事件监听来捕捉用户的互动,在种情况下,你可以使用类的event handlers.来预定义事件的处理方法。
Event Listeners
View类里的event listener是一个带有回调方法的接口,当UI里的组建是被用户触发时,这些方法会被系统框架所调用
来自View.OnClickListener 它会被调用当点击这个Item(在触摸模式),或者当光标聚集在这个Item上时按下“确认”键 ,导航键,或者轨迹球。
onLongClick()
来自View.OnLongClickListener.
它会被调用当长按这个Item(在触摸模式),或者当光标聚集在这个Item上时长按 “确认”键 ,导航键,或者轨迹球。
onFocusChange()
来自View.OnFocusChangeListener 它会被调用当光标移到或离开这个Item,
来自View.OnKeyListener..它会被调用,当光标移到这个Item,按下和释放一个按键的时候
来自View.OnTouchListener. 它会被调用 ,在这个Item的范围内点触的时候
onCreateContextMenu()
来自View.OnCreateContextMenuListener.
它会被调用, 当上下文菜单被建立时(由于持续的“长按”)
见讨论Creating Menus更多的信息。
这些方法和嵌套接口类都是一一对应的,如果确定其中一种方法处理你的互动事件,你需要在Activity中实现这个带有这个方法的接口,并把它作为匿名类,然后,通过实例的View.set...Listener() 方法来设置监听器(例如,调用setOnClickListener(),来设置OnClickListener做为监听器)
下面是为一个按钮设置监听器的例子:
// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
public void onClick(View v) {
// do something when the button is clicked
protected void onCreate(Bundle savedValues) {
// Capture our button from layout
Button button = (Button)findViewById(R.id.corky);
// Register the onClick listener with the implementation above
button.setOnClickListener(mCorkyListener);
下面这个列子我们会发现用Activity去实现OnClickListener接口,并作为它的一部分,会更方便,而不必去加载额外的类和对象
public class ExampleActivity extends Activity implements OnClickListener {
protected void onCreate(Bundle savedValues) {
Button button = (Button)findViewById(R.id.corky);
button.setOnClickListener(this);
// Implement the OnClickListener callback
public void onClick(View v) {
// do something when the button is clicked
这里注意一下,以上的例子可以看出onClick()是没有返回值的,但是有些事件处理方法是必须带返回值,它取决于的具体的事件,有些那么做的原因,看下面的例子:
onLongClick()
它返回的布尔值表明你已经完成了这个事件的处理,还是应该把它继续传下去。返回true表明已经处理完成并且停止了传递,如果返回为false表明事件还没有完成,或者它还需要继续被传递给其他的监听器
它返回的布尔值表明你已经完成了这个事件的处理,还是应该把它继续传下去。返回true表明已经处理完成并且停止了传递,如果返回为false表明事件还没有完成,或者它还需要继续被传递给其他的监听器
它返回的布尔值表明你是否已经完成了这次事件的行动,重要的是后面可能还有很多后续的行动,这样,如果你返回false,表明在接到下一次的后续行动中,你还没有完成之前行为也没有意向去处理随后的行动,因此,在这个事件的后续行动中将不会再被调用。 如fingure手势,或最终行动事件
记住:我们所关注的事件肯定是发生在高亮聚集的焦点,它从总视图(顶级的)被一级一级的向下传递,直到我们想要关注的组件,当焦点聚集在这个视图(或视图中的子视图)时 ,你能够使用dispatchKeyEvent() 作为一种代替方法,来捕获在视图上的按键事件,你还可以使用onKeyDown()和onKeyUp().来捕获所有事件内的交互活动
注意:在 Android 框架中会调用event handlers先处理事件,然后会适当的传递给二级默认的预定义handlers中;因此 如果返回true,将会停止这个事件的传递,View中默认事件处理方法的回调也会被阻止。因此,当你返回true肯定表明你是要终止这个事件的延续。(这个地方有点不懂。。。原文是:Android will call event handlers first and then the appropriate default handlers from the class definition
second. As such, returning true from these event listeners will stop the propagation of the event to other event listeners and will also block the callback to the default event handler in the View. So be certain that you want to terminate the event when you
return true.)
Event Handlers
如果您建立一个继承于View自定义组件,然后您可以定义一些回调方法用作默认的事件处理程序。该文件中关于Building Custom Components,您会学习一些共用的回调方法用于事件处理,其中包括:
onKeyDown(int, KeyEvent) - Called when a new key event occurs.
onKeyUp(int, KeyEvent) - Called when a key up event occurs.
onTrackballEvent(MotionEvent) - Called when a trackball motion event occurs.
onTouchEvent(MotionEvent) - Called when a touch screen motion event occurs.
onFocusChanged(boolean, int, Rect) - Called when the view gains or loses focus.
还有其他一些方法,这不属于View类,但可以直接影响到你处理事件的方式,所以在布局内管理更复杂的事件可以考虑到这些方法:
Activity.dispatchTouchEvent(MotionEvent) - This allows your Activity to intercept all touch events before they are dispatched to the window.
ViewGroup.onInterceptTouchEvent(MotionEvent) - This allows a ViewGroup to watch events as they are dispatched to child Views.
ViewParent.requestDisallowInterceptTouchEvent(boolean) - Call this upon a parent View to indicate that it should not intercept touch events with onInterceptTouchEvent(MotionEvent).
Touch Mode
当用户在使用方向键或轨迹球浏览用户界面时,有必要给于一个焦点在可操作的组件上(如一个Button),使用户可以看到它将接受输入命令。如果设备有触摸功能,那么,当用户与界面的交互就不再需要有一个高亮在组件上,或一个焦点在view上,因此,模式的互动名为"触摸模式"。对于一个触摸设备,一旦有用户接触屏幕时,该设备将进入触摸模式.在点触某个View后,只有的它的方法isFocusableInTouchMode()返回为真时,才会有聚集焦点,如文本编辑工具。其他的界面只可以点触,但不会聚集焦点(高亮),如button
被点触时就不会聚集焦点,当它被按下时只会调用on-click监听器的回调方法。
任何时候用户接触方向键或者滚动轨迹球时,该设备将退出触摸模式,并聚集焦点,用户可以恢复与用户界面的键盘交互,而不必在屏幕上。触摸模式的状态是由整个系统来维持的(all windows and activities),要查询目前所处的状态,你可以调用isInTouchMode()方法来获得,看看设备目前是否处于触摸模式。
Handling Focus
系统框架将处理日常的焦点移动来响应用户的输入,它包刮改变焦点(当界面是被移除,隐藏,或者作为一个新的View变为可用状态),通过 isFocusable()这个方法我们可以知道view是否具有接受焦点的资格,也可以通过setFocusable().来设置view接受焦点的资 格,对应在触摸模式下,你可以调用isFocusableInTouchMode().来获知是否有焦点来响应点触,也可以通过 setFocusableInTouchMode().来设置是否有焦点来响应点触的资格.
一般来说,在这个垂直布局,浏览的焦点会从第一个按钮开始,不会是从第二个或者其他的,现在topButtont已经通过nextFocusUp (反之亦然)确定了bottom.
通常如果你想宣布用户界面具有焦点的资格 (如果这个界面在传统上是没有的),可以在xml布局里去加上的android:focusable的属性,并设置它的值,您也可以宣布在触摸模式下具有焦点的资格,同样也只在xml里添android:focusableInTouchMode.的属性,并设置它的值. 当用户请求在某个界面聚集焦点时,会调用requestFocus().这个方法。监听到焦点活动(获得焦点或失去焦点都会被通知),会调用onFocusChange(),这个方法,这也是上节所讨论的Event Listeners。
&&&&推荐文章:
【上篇】【下篇】10:57 提问
Android图片双击放大缩小可平移,单击响应Onclick事件屏蔽怎么办?
现在项目有一个需求,实现类似微博图片在viewpager预览效果,图片能够双击放大缩小、单击响应onclick事件退出viewpager回到主页面。
现在卡在的地方是实现图片双击放大缩小的代价是在自定义imageview里面将ontouch写死返回ture,这屏蔽了onclick消息。
求解决方法,或者提供第三方包也行。
按赞数排序
双击为什么不用 ondoubleclick ?
重写ImageView设置OnDoubleTapListener监听
其他相似问题
相关参考资料<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&当前访客身份:游客 [
指尖无数次的重复,只为跳出循环的那一次break ╮(╯▽╰)╭ while(1){ if(1){ } }
:楼主你好! 请问下如果使用手机和电脑共享功能这...
:直接用控件也可以的:image.setColorFilter(Colo...
:楼主可以移步这里看具体信息: http://www.oschi...
:楼主你好,我是这么操作的 OkHttpClient sClient...
:楼主发我一份demo吧,谢谢,...
:引用来自“thearyong”的评论 引用来自“小鱼er”...
:引用来自“冲浪的水手”的评论你好,我想问一下,...
:你好,我想问一下,为什么回去SSLContext的实例不...
:native方法应该如何写呢
今日访问:47
昨日访问:141
本周访问:438
本月访问:1142
所有访问:96310
android ImageView实现变暗效果
发表于3年前( 21:25)&&
阅读(22648)&|&评论()
0人收藏此文章,
android项目中做一个默认图片变暗,有焦点时变亮的效果。相信大家都能各种办法,各种手段很容易的实现这个效果。这里记录下作者实现这个效果的过程及遇到的问题,仅供参考。
见下图(注:因为是eclipse截图,所以有点色差,黄色变成蓝色,不过暗亮的效果还是明显的): & & & & & & &&
1.脑袋里转的第一个实现的想法是:
& & 2张图片,一张暗图,一张亮图。监听焦点事件,更换图片。 & & 一个资源图片弄2份,并且这图片是从服务器上获取的,不实际。
2.记得之前有过用设置控件的透明度。好,来试试: & & &有2个不同的重载方法,形参分别为float和int。这俩有啥区别呢?
public void setAlpha(float alpha)
设置View的透明度为0~1的值,0完全透明,1完全不透明。注意这里说的是View
public void setAlpha(int alpha)
设置View的透明度为0~255的值,0完全透明,255完全不透明。
image 的透明度,并且该方法在API 16的版本里被setImageAlPha(int)代替
眼见为实,来分别看看效果:
iv.setAlpha(0.5f)效果图为:
setImageAlpha(100),效果为:╮(╯▽╰)╭报异常退出了。
07-08 21:17:12.012: E/AndroidRuntime(29310): java.lang.NoSuchMethodError: android.widget.ImageView.setImageAlpha
测试机为android4.0.3,对应api为15.eclipse里有设置对应为16的api,但一运行就挂了╮(╯▽╰)╭。目测应该是兼容性问题,这里不深究了,感觉上篇讲的targetVersion有关,不过没验证。
这里还有另外一个方法,iv.getBackground().setAlpha(100);运行效果出来和上图使用iv.setAlpha(0.5f),不过透明程度有点不一致(但没大看出来)。前者值为(1~255),后者为(0~1)。
到这里大家应该发现,和想要实现的效果相差甚远吧,作者也大失所望。
继续找找还有啥子方法呢?不小心找到了个这个方法:
颜色过滤?是不ps的滤镜?来看下怎么用:
来试下效果:
iv.setColorFilter(Color.TRANSPARENT,PorterDuff.Mode.XOR);
貌似效果没变。看看上面用法说明
Set a tinting option for the image
是设置图片image,不是控件ImageView的.换成下面的用法:
Drawable drawable = imgs.get(i);
drawable.setColorFilter(Color.TRANSPARENT,PorterDuff.Mode.XOR);
iv.setImageDrawable(drawable);
还是没效果。 再仔细琢磨下,是不上面用的颜色值不对呢?换下成Color.GRAY,也不对。之后不管用哪个颜色,图片都显示不出来。
&好吧,我妥协了。用上面帖子里的例子试下吧。改成多层样式的:
drawable.setColorFilter(Color.GRAY,PorterDuff.Mode.MULTIPLY);
O(∩_∩)O~哈哈,效果出来了:
这是个不错的尝试。然后获取焦点时,把这个滤镜清掉就OK了。
drawable.clearColorFilter();
显示为原始亮图了。
注:其实作者最开始贴上去的2张图并不是用上面滤镜方法实现的。上面方法只是在整理这篇博客时,临时发现的。就尝试下,没想到成功了。早知道当时就都多试几次,就不用下面这种方法了。
继续瞅瞅ImageView的api吧,看看都有些啥子属性。相信大家都会注意到ImageView特有的这2个方法:
public void setImageDrawable (Drawable drawable)
Added in API level 1
Sets a drawable as the content of this ImageView.
Parameters
drawable The drawable to set
public void setBackgroundDrawable(Drawable background)
This method was deprecated in API level 16. use setBackground(Drawable) instead
这2者有啥区别呢?这个相信用过的人都不难理解。
当设置setBackgroundDrawable时,整个ImageView的控件背景色会变。 当设置setImageDrawable时,ImageView中间内容区会被图片填充。但是周围会有一些边距,默认无法填充整个控件(当然,这也是有属性设置的)。
ScaleType的值分别代表的意义: ImageView是Android中的基础图片显示控件,该控件有个重要的属性是ScaleType,该属性用以表示显示图片的方式,共有8种取值   
ScaleType.CENTER::图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片中间部分,若小于,则直接将图片居中显示。   
ScaleType.CENTER_CROP:将图片等比例缩放,让图像的短边与ImageView的边长度相同,即不能留有空白,缩放后截取中间部分进行显示。   
ScaleType.CENTER_INSIDE:将图片大小大于ImageView的图片进行等比例缩小,直到整幅图能够居中显示在ImageView中,小于ImageView的图片不变,直接居中显示。   
ScaleType.FIT_CENTER:ImageView的默认状态,大图等比例缩小,使整幅图能够居中显示在ImageView中,小图等比例放大,同样要整体居中显示在ImageView中。   
ScaleType.FIT_END:缩放方式同FIT_CENTER,只是将图片显示在右方或下方,而不是居中。   
ScaleType.FIT_START:缩放方式同FIT_CENTER,只是将图片显示在左方或上方,而不是居中。   
ScaleType.FIT_XY:将图片非等比例缩放到大小与ImageView相同。   
ScaleType.MATRIX:是根据一个3x3的矩阵对其中图片进行缩放
比如说上图,蓝色图标为setImageDrawable,后面灰色背景为setBackgroundDrawable,src在背景之上。这样大家应该能明白了吧。 好吧。言归正传,有这2个属性+ScaleType.CENTER_CROP,完全可以实现图片变暗变亮效果了。
1.用一张过滤遮盖变暗的图片filter_bg.png作为ImageView的源图片:setImageDrawable
2.把要显示的图片show.png设置为背景:setBackgroundDrawable
3.当变亮时,用一张遮盖后完全透明的图片transparent_bg.png替换filter_bg.png
这样就实现变暗变亮的效果了。
注:设置时,要设置src填充整个控件CENTER_CROP
&ImageView
android:id="@+id/ivs_show1"
android:layout_width="315px"
android:layout_height="120px"
android:src="@drawable/filter_bg"
android:scaleType="centerCrop"/&
作者就是采用这种笨方法来实现的。欢迎大家吐槽O(∩_∩)O~
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读

我要回帖

更多关于 imageview加点击事件 的文章

 

随机推荐