Android ImageButton的使用 及长按Button的实现

Android ImageButton使用详解(系列教程四) Android ImageButton使用详解。 阅读详情
我自己用Photoshop画了2种按钮图片,每种有3种状态,分为:normal、focus、press等。
放在工程的“res/drawable/”目录下。
ImageButton要使用这些图片做出漂亮的效果,可以在Java代码中使用setImageResource(int)方法,我采用xml文件中设置android:src属性。

在工程目录“res/drawable/”下新建“imgbt1.xml”,文件内容为:
[html]   view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.   
  4.     <item android:state_pressed="true"  
  5.            android:drawable="@drawable/bt1_press" /> <!-- pressed -->  
  6.     <item android:state_focused="true"  
  7.            android:drawable="@drawable/bt1_focus" /> <!-- focused -->  
  8.     <item android:drawable="@drawable/bt1_normal" /> <!-- default -->  
  9.   
  10. </selector>  

新建“imgbt2.xml”,文件内容为:
[html]   view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.   
  4.     <item android:state_pressed="true"  
  5.            android:drawable="@drawable/bt2_press" /> <!-- pressed -->  
  6.     <item android:state_focused="true"  
  7.            android:drawable="@drawable/bt2_focus" /> <!-- focused -->  
  8.     <item android:drawable="@drawable/bt2_normal" /> <!-- default -->  
  9.   
  10. </selector>  

使用方法:
[html]   view plain copy
  1. <ImageButton  
  2.     android:id="@+id/imgbt1"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:background="#a000ff00"  
  6.     android:src="@drawable/imgbt1"  
  7.     />  
android:background="#a000ff00" 可设置Button或者ImageButton的背景为透明
表达式顺序是“aabbggrr”,其中“aa=alpha”(00-ff)、“bb=blue”(00-ff)、“gg=green”(00-ff)、“rr=red”(00-ff)。值以十六进制表示,对于alpha值,0表示完全透明,255表示完全不透明。
看文档,可在Java代码中使用方法onSetAlpha (int alpha)来设置透明度。


Button长按事件的实现
我在网上查看资料的时候,看到一篇游戏开发的长按Button实现,关键代码有给出,但都是抄来抄去,且并不完全,决定实现它。
增加个接口,用来实现监听事件。
[java]   view plain copy
  1. public interface RepeatListener  
  2. {  
  3.     /** manpeng 
  4.      * @param v 用户传入的Button对象 
  5.      * @param duration 延迟的毫秒数 
  6.      * @param repeatcount 重复次数回调 
  7.      */  
  8.     void onRepeat(View v, long duration, int repeatcount);  
  9. }  

既然要实现ImageButton类的长按事件,首先自定义RepeatButton类,当然这个类要继承ImageButton。
需要增加RepeatButton类的成员变量mInterval,用来记录长按的时间,也就是说press这个按钮的时候,多久时间算一次长按。
例:mInterval=5000;//mInterval设为5秒钟,假设用户长按Button了12秒,那么用户长按了该按钮2次。

当长按时,会执行performLongClick(),我们override该方法,并启动一个线程。
这是一个Runnable线程mThread,在线程实现中,每隔mInterval时间,判断按键是否还在按下,以及回调监听事件,是实现长按Button的关键。
postDelayed(this, mInterval);//这句实现了长按事件中,线程mThread不断的循环判断

当用户结束长按的时候,根据触摸或按键的不同,此时可能触发onTouchEvent或触发onKeyDown函数,我们override这2个函数后,在其中要停止线程。
因为是延迟一定的时间,才执行线程,所以在结束长按的时候要把没有执行的线程drop掉:
removeCallbacks(mThread);//删除队列当中未执行的线程对象,否则线程可能还会再执行一次。
下面给出RepeatButton类的代码:
[java]   view plain copy
  1. /* 
  2.  * Copyright (C) 2012 Manpeng 
  3.  * 
  4.  * http://blog.youkuaiyun.com/manp1212 
  5.  * 
  6.  */  
  7. package com.manpeng.example;  
  8.   
  9. import android.content.Context;  
  10. import android.os.SystemClock;  
  11. import android.util.AttributeSet;  
  12. import android.util.Log;  
  13. import android.view.KeyEvent;  
  14. import android.view.MotionEvent;  
  15. import android.widget.ImageButton;  
  16.   
  17. /** 
  18.  * @author manpeng 
  19.  */  
  20. public class RepeatButton extends ImageButton  
  21. {  
  22.     public static final String TAG = "RepeatButton";  
  23.     private long mStart;//长按开始时间  
  24.     private int mRepeatCount;//长按重复次数  
  25.     private RepeatListener mListener;//  
  26.     private long mInterval = 500;//长按一次持续时间   
  27.   
  28.     public RepeatButton(Context context)  
  29.     {  
  30.         super(context);  
  31.         Log.d(TAG, "RepeatButton1");  
  32.     }  
  33.   
  34.     public RepeatButton(Context context, AttributeSet attrs)  
  35.     {  
  36.         super(context, attrs);  
  37.         Log.d(TAG, "RepeatButton");  
  38.         setFocusable(true); //设置焦点  
  39.         setLongClickable(true); //启用长按事件,长按后会执行performLongClick()  
  40.     }  
  41.   
  42.     public RepeatButton(Context context, AttributeSet attrs, int defStyle)  
  43.     {  
  44.         super(context, attrs, defStyle);  
  45.         Log.d(TAG, "RepeatButton3");  
  46.     }  
  47.   
  48.     private Runnable mThread = new Runnable()  
  49.     {  
  50.         public void run()  
  51.         {  
  52.             Log.d(TAG, "mRepeaterThread run()");  
  53.             doRepeat(false);  
  54.             if (isPressed())  
  55.             {  
  56.                 Log.d(TAG, "mRepeaterThread run() press");  
  57.                 postDelayed(this, mInterval);//延迟mInterval后执行当前线程  
  58.             }  
  59.         }  
  60.     };  
  61.       
  62.     /** 
  63.      * @param end 表示最后一次长按,即结束长按事件 
  64.      */  
  65.     private void doRepeat(boolean end)  
  66.     {  
  67.         Log.d(TAG, "mRepeaterThread run() end=" + end);  
  68.         long now = SystemClock.elapsedRealtime();//获取当前时间  
  69.         if (mListener != null)  
  70.         {  
  71.             mListener.onRepeat(this, now - mStart, end ? -1 : mRepeatCount++);  
  72.         }  
  73.     }  
  74.       
  75.     /** 
  76.      * 长按结束 
  77.      */  
  78.     private void endRepeat()  
  79.     {  
  80.         doRepeat(true);  
  81.         mStart = 0;  
  82.     }  
  83.       
  84.     /** 
  85.      * 设置长按监听事件,初始化mInterval 
  86.      */  
  87.     public void setRepeatListener(RepeatListener listener, long interval)  
  88.     {  
  89.         Log.d(TAG, "setRepeatListener interval=" + interval);  
  90.         mListener = listener;  
  91.         mInterval = interval;  
  92.     }  
  93.       
  94.     @Override  
  95.     public boolean performLongClick()  
  96.     {  
  97.         Log.d(TAG, "performLongClick");  
  98.         mStart = SystemClock.elapsedRealtime();//获取系统当前时间  
  99.         mRepeatCount = 0;  
  100.         post(mThread);//调用post()方法,执行mThread  
  101.         return true;  
  102.     }  
  103.       
  104.     @Override  
  105.     public boolean onTouchEvent(MotionEvent event)  
  106.     {  
  107.         if (event.getAction() == MotionEvent.ACTION_UP)  
  108.         {  
  109.             Log.d(TAG, "onTouchEvent UP");  
  110.             removeCallbacks(mThread);//删除队列当中未执行的线程对象     
  111.             if (mStart != 0)  
  112.             {  
  113.                 endRepeat();  
  114.             }  
  115.         }  
  116.         return super.onTouchEvent(event);  
  117.     }  
  118.       
  119.     @Override  
  120.     public boolean onKeyDown(int keyCode, KeyEvent event)  
  121.     {  
  122.         //Log.d(TAG, "onKeyDown keyCode=" + keyCode);  
  123.         switch(keyCode)  
  124.         {  
  125.         case KeyEvent.KEYCODE_DPAD_CENTER:  
  126.         case KeyEvent.KEYCODE_ENTER:  
  127.             super.onKeyDown(keyCode, event);  
  128.             return true;  
  129.         }  
  130.         return super.onKeyDown(keyCode, event);  
  131.     }  
  132.       
  133.     @Override  
  134.     public boolean onKeyUp(int keyCode, KeyEvent event)  
  135.     {  
  136.         Log.d(TAG, "onKeyUp keyCode=" + keyCode);  
  137.         switch(keyCode)  
  138.         {  
  139.         case KeyEvent.KEYCODE_DPAD_CENTER:  
  140.         case KeyEvent.KEYCODE_ENTER:  
  141.             removeCallbacks(mThread);  
  142.             if (mStart != 0)  
  143.             {  
  144.                 Log.d(TAG, "onKeyUp mStart=" + mStart);  
  145.                 endRepeat();  
  146.             }  
  147.             super.onKeyUp(keyCode, event);  
  148.             return true;  
  149.         }  
  150.         return super.onKeyUp(keyCode, event);  
  151.     }  
  152.       
  153. }  

在布局xml文件中,添加RepeatButton,需要以下定义。
[html]   view plain copy
  1. <com.manpeng.example.RepeatButton  
  2.     android:id="@+id/rptbt3"  
  3.     android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content"  
  5.     android:background="#80000000"  
  6.     android:src="@drawable/imgbt2"  
  7.     />  
注意 :RepeatButton是我们自定义的类,所以引用的时候,要加上全名。

在Activity中,要使用的话,先要实现RepeatListener:
[java]   view plain copy
  1. public class MyRepeatListener implements RepeatListener  
  2. {  
  3.     public void onRepeat(View v, long duration, int repeatcount)  
  4.     {  
  5.         //加入处理代码  
  6.     }          
  7. }  

然后设置setRepeatListener,实现监听:
[java]   view plain copy
  1. RepeatButton rb = (RepeatButton)findViewById(R.id.rptbt3);  
  2. rb.setRepeatListener(new MyRepeatListener(), 5000);  

下面给出源码的下载地址: http://download.youkuaiyun.com/detail/manp1212/4400624
Android自定义Button/ImageButton形状 先看运行效果:              我用的方法有点投机取巧,并没有真正的修改Button的形状,只是视觉上改变了,在使用其他的app时发现,有很多也是“伪”形状。 A.首先,要准备两张图片back1.png,back2.png,这是两张背景是透明的图片,简单说下制作方法 1.用美图打开源图back.jpg,抠图,自动抠图(挺好用的),保存为.png格式的图片,然后再裁剪一下...(注 阅读详情

相关推荐

Android使用xml定义带背景Button(解决ImageButton不能加文字的问题)

虽然Android给我们提供了ImageButton 这一组件来实现带有自定义图片背景的Button,但是ImageButton有一个缺陷就是不能添加文字而如下的方法则可以综合二者的优势.     用到的图片:     在drable下新建一个button_blue_style.xml文件来描述Button的按下效果: <item android:state_

牟蘑菇的专栏 3232

【Android】-- 如何使用按钮和图片(点击事件、长按点击、同时展示文本和图像、ImageView)

android按钮和图片的基础:Button、点击和长按点击、禁用与恢复按钮、ImageView、ImageButton、同时展示文本与图像。

个人博客 6653

Android 点击ImageButton时有“按下”的效果的实现

主要介绍了 Android 点击ImageButton时有“按下”的效果的实现的相关资料,需要的朋友可以参考下

实验二 Button 事件处理

实验二 Button 事件处理 【实验目的】 1、 了解 Android 编程基础 2、 熟悉 Button 控件、 ImageButton 控件并且可以对 Button 事件进行相应处理 【实验内容】制作一个登陆框,要求用户输入账号和密码。点击一个 ImageButton 按钮,在后台判断用户输入的账号和密码。 如果账号是“ LeiBusi”并且密码为”Halo3Q”,则将 ImageButton 按钮

lianghq6的博客 2074

【Isaac Sim】无头服务器远程桌面连接实战:Turbovnc配置与常见问题解决

本文详细介绍了在无头GPU服务器上通过Turbovnc远程桌面连接并运行NVIDIA Isaac Sim的实战教程。针对无图形界面服务器运行仿真软件的核心痛点,文章提供了从Turbovnc安装配置、SSH隧道建立,到以普通用户身份启动服务、解决GLXBadFBConfig等常见图形错误的完整方案,帮助开发者在云端高效部署机器人仿真环境。

weixin_29254673的博客 774

网络调试和分析工具 Proxyman Premium

它支持MacOS、iOS和iPadOS等操作系统,提供丰富的功能,如查看和编辑HTTP/HTTPS请求和响应、设置断点、过滤请求等。Proxyman Premium还支持WebSocket、GraphQL和gRPC等现代网络协议调试,并通过直观且图形化的操作界面,使用户能高效地监控和操纵网络数据流。此外,它还具备多种高级功能,如WebSocket支持、DNS欺骗、自定义SSL证书等,为开发人员提供极大的便利。同时,由于软件版本更新和界面调整,上述步骤可能会有所变化,建议您参考最新版本的官方文档进行操作。

llhf688的博客 2003

第24章、OnLongClickListener长按事件(从零开始学Android)

在Android App应用中,OnLongClick事件表示长按2秒以上触发的事件,本章我们通过长按图像设置为墙纸来理解其具体用法。   知识点:OnLongClickListener   OnLongClickListener接口与之前介绍的OnClickListener接口原理基本相同,只是该接口为View长按事件的捕捉接口,即当长时间按下某个View时触发的事件,该接口对应的回调方

hellobabygogo3的专栏 867

电信天翼云OS(ctyunos)内网离线安装Docker-CE保姆级避坑指南(附完整依赖包清单)

本文提供电信天翼云OS(ctyunos)内网环境下Docker-CE的离线安装全攻略,涵盖依赖分析、离线包制备、冲突解决等关键步骤。针对金融、政务等隔离网络场景,详细解析如何通过本地仓库构建和优化配置,实现高效安全的容器化部署,助力企业快速搭建内网Docker环境。

400

Android 之 Button (按钮)与 ImageButton (图像按钮)

StateListDrawable是Drawable资源的一种,可以根据不同的状态,设置不同的图片效果,关键节点,我们只需要将Button的background属性设置为该drawable资源即可轻松实现,按下 按钮时不同的按钮颜色或背景!drawable:引用的Drawable位图,我们可以把他放到最前面,就表示组件的正常状态~:是否获得焦点:是否获得窗口焦点:控件是否可用:控件可否被勾选,eg:checkbox:控件是否被勾选:控件是否被选择,针对有滚轮的情况:控件是否被按下。

leyang0910的博客 2942

深入解析Uplift模型评估:AUUC指标的计算与应用

本文深入解析了Uplift模型评估的核心指标AUUC。针对传统响应模型无法区分用户真实转化动因的痛点,AUUC通过量化模型对用户增益(Uplift)的排序能力,有效衡量营销干预的增量收益。文章详细拆解了AUUC的计算逻辑,从构建Qini曲线到Python代码实战,并强调了其在预算约束下的精准营销等场景的应用价值与常见陷阱。

weixin_29254029的博客 481

YOLOv9 损失函数解析

YOLOv9作为YOLO系列的最新成员,在损失函数设计上进行了多项创新,重点优化了动态任务对齐机制、多模态定位损失融合以及跨层级梯度协同,进一步提升了检测精度与训练效率。

浩瀚之水的专栏 1293

Android学习之路(5) UI控件之Button (按钮)与 ImageButton (图像按钮)

StateListDrawable是Drawable资源的一种,可以根据不同的状态,设置不同的图片效果,关键节点 < selector >,我们只需要将Button的background属性设置为该drawable资源即可轻松实现,按下 按钮时不同的按钮颜色或背景!drawable:引用的Drawable位图,我们可以把他放到最前面,就表示组件的正常状态~state_focused:是否获得焦点state_window_focused:是否获得窗口焦点state_enabled:控件是否可用。

qq_32907491的博客 1675

姿态传感器/陀螺仪之LSM6DS3TR-C应用原理图设计

LSM6DS3TR-C是一款由意法半导体(STMicroelectronics)推出的高性能、低功耗的惯性测量单元(IMU),集成了3轴加速度计和3轴陀螺仪,用于测量加速度、角速度以及设备的姿态和运动。

corlin6688的博客 872

android 动态添加按钮点击事件无效,android studio 菜鸟实战项目 之 点击事件以及动态添加(示例代码)...

原始界面: 登陆失败: 登陆成功: 动态添加控件:布局如下:(特别声明最后又一个空linearlayout,这是为了后面的动态添加事件)xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layo...

weixin_35983438的博客 826

11、基于拓扑质心和树编辑距离的RNA二级结构比较方法

本文介绍了一种基于拓扑质心和树编辑距离的RNA二级结构比较方法,特别适用于处理具有假结结构的RNA。通过PEELING算法识别拓扑质心并将其转换为树结构,结合树编辑距离进行高效比较,并提供工具planeGraph2tree实现该方法。博文详细描述了方法原理、操作流程以及应用示例,展示了其在功能性非编码RNA分析中的实用性。

resnet7explorer的博客 115

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【Android 常见控件使用】Button(按钮)与ImageButton(图像按钮)

文章目录Button(按钮)与ImageButton(图像按钮)本节引言1.StateListDrawable简介2.按钮点击事件的触发方式3.实现按钮的按下效果4.使用颜色值绘制圆角按钮5.实现Material Design水波效果的Button Button(按钮)与ImageButton(图像按钮) 本节引言 今天给大家介绍的Android基本控件中的两个按钮控件,Button普通按钮和ImageButton图像按钮; 其实ImageButton和Button的用法基本类似,至于与图片相关的则和.

懂得一千零一种,赋予你失败的方法! 5791

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

9、从头学Android之Button和ImageButton

Button 类结构图: 由类结构图,可以看出Button是继承于TextView的,所以TextView的一些属性也适用于Button控件。对于Button控件,相信大多数开发人员是再熟悉不过了,那么废话不多说,直接应用实践吧   实践演练: 1、  如何设置按钮

90worker 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android安卓开发基础-Button与ImageButton

介绍安卓控件Button及ImageButton在java文件及xml文件中的使用(主要以Button为例)

weixin_53743049的博客 1168

Android Button和ImageButton

---恢复内容开始--- Button是一种按钮控件,用户能够在该控件上点击,并且引发相应的事件处理函数 ImageButton用以实现能够显示图像功能的按钮控件 实例: 建立一个“ButtonDemo”的程序,包含Button和ImageButton两个按钮,上方是Button按钮,下方是ImageButton控件 ButtonDemo在XML文件中的代码: ...

axp0000000的博客 439

ImageButton带有文字(或者Button中带有文字与图片)

安卓开发中,很多人都会遇到一个问题:如何让按钮带上图片以及文字描述呢?这里我找了几种解决方案: 一、布局文件直接使用Button,使用自带的drawableTop设置图片相对文本位置,然后设置文本即可 <Button android:id="@+id/f1" android:layout_width="wrap_content"

码农的果园 2万+

Android常用控件之Button与ImageButton

掌握Android常用控件之Button与ImageButton的用法,熟悉它们的常用属性。 1.相关代码: activity_main.xml代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"

weixin_43362360的博客 462

【10】Android UI控件 - Button & ImageButton

前言 Butten 继承自 TextView,因而很多 TextView的属性也可以用在 Button 上。 ImageButton 继承自 Button,用法与 Button 大致相同,值得注意的是 Button可以显示文字,而 ImageButton 无法通过 android:text 显示文字,主要拿来显示图片。 相关方法&属性 除了构造函数外,Button类没有自己定义...

Hsy的博客 444

android中ImageView、ImageButton、Button之间的区别

1.继承不同:  java.lang.Object -> android.view.View -> android.widget.ImageView -> android.widget.ImageButton  java.lang.Object -> android.view.View -> android.widget.TextView -> android.widget.Button

小羊快跑的专栏 6909

Android成长之路-Button、ImageButton、ToggleButton按钮的功能和用法

ToggleButton按钮的功能和用法:(实现动态控制布局) 定义一个layout布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_par

1万+
上一篇: 精确定位ListView
下一篇: ListView在滚动时 背景被遮盖的解决办法
gwpJava
博客等级 码龄14年 11粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值