- 浏览: 128570 次
- 性别:
- 来自: 南京
最新评论
-
cenyi2012:
来个图文并茂不是更好。。。
TabHost两种实现方式 -
youlingxifeng:
谢谢了,很受用,你有没有遇到过这样的问题啊build/core ...
Android源码编译全过程 -
flower_is:
不错不错!
Android的selector,背景选择器 -
yang668:
很好 真心的谢谢
反编译apk -
windloverain:
编译2.3的代码需要用1.6的sdk
另外,安装完java s ...
Android源码编译全过程
注:原文出自:http://www.cnblogs.com/TerryBlog/archive/2010/08/31/1813481.html
SeekBar 本身有就是一个View 对象,既然是View 对象那也证明它有setOnLongClickListener 事件,众所周知,这个事件是让一个View 对象拥有长按功能,进而达到我们想要实现的操作。
为SeekBar 添加长按事件监听如下:
那么,我们来试试,它是否可以成立 ,为它添加一个Toast :
Toast.makeText(ttActivty.this, "fda", 100).show();
一般来说,我们运行项目,然后长按SeekBar 即能够把Toast Show 出来。那么试一下吧,试了之后结果很让人费解,因为我们知道SeekBar 继承自AbsSeekBar 而AbsSeekBar 又是继承自ProgressBar ,而ProgressBar 的长按事件是可行的,可是这里我们同样的操作却得不到效果,Toast 并不能像我们如期想像的一样显示出来。那是不是就是说SeekBar 不支持长按事件呢?这点我也不好下定论,总之我们为其他同样的View 对象的操作是可行的。好了,既然SeekBar 可能不支持长按事件,那我们就为它模拟一个长按事件,模拟思路如下:
* 1、继承SeekBar 重写内部的事件和方法
* 2、实现一个线程,当在规定的时间内停住即认为其是一个长按动作
* 3、实现长按事件的接口函数
* 4、并为重写的SeekBar 添加自己的OnSeekBarChangeListener 监听事件
具体操作看如下:
1、继承SeekBar 重写内部的事件和方法
代码如下:
public class seekBarDemo extends SeekBar implements OnTouchListener
2、实现一个线程,当在规定的时间内停住即认为其是一个长按动作
这里实现一个自己的Runable 对象,向Handler 对象发送消息,代码如下:
之后实现一个handler 对象用来设置该重写View 具有的长按事件
3、实现长按事件的接口函数
4、并为重写的SeekBar 添加自己的OnSeekBarChangeListener 监听事件
这里我们首先定义一个onChange 接口 ,接口中有三未实现的方法,分别代表SeekBar 的三种状态
实现接口函数:
t
完整的参考代码如下:
在布局的XML可以如下定义:
本人对该例子的学习笔记:
1、重写接口事件,如本例子中的onChange事件就是用来覆盖SeekBar中的OnSeekBarChangeListener事件,自定义的事件的方法和原来的方法名称一样,然后在原来的事件中调用自定义事件对应的方法。
2、长按事件的触发必定先触发onTouch()事件,于是可以在OnTouch()事件中启动线程,并让该线程睡眠400毫秒,结合isStop(长按时为true,放开的话就变成false了)变量就可以知道长按了多长时间。
3、该例子中用pp变量判断是否是按在同一个地方。
SeekBar 本身有就是一个View 对象,既然是View 对象那也证明它有setOnLongClickListener 事件,众所周知,这个事件是让一个View 对象拥有长按功能,进而达到我们想要实现的操作。
为SeekBar 添加长按事件监听如下:
SeekBar.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { // TODO Auto-generated method stub return false; } });
那么,我们来试试,它是否可以成立 ,为它添加一个Toast :
Toast.makeText(ttActivty.this, "fda", 100).show();
一般来说,我们运行项目,然后长按SeekBar 即能够把Toast Show 出来。那么试一下吧,试了之后结果很让人费解,因为我们知道SeekBar 继承自AbsSeekBar 而AbsSeekBar 又是继承自ProgressBar ,而ProgressBar 的长按事件是可行的,可是这里我们同样的操作却得不到效果,Toast 并不能像我们如期想像的一样显示出来。那是不是就是说SeekBar 不支持长按事件呢?这点我也不好下定论,总之我们为其他同样的View 对象的操作是可行的。好了,既然SeekBar 可能不支持长按事件,那我们就为它模拟一个长按事件,模拟思路如下:
* 1、继承SeekBar 重写内部的事件和方法
* 2、实现一个线程,当在规定的时间内停住即认为其是一个长按动作
* 3、实现长按事件的接口函数
* 4、并为重写的SeekBar 添加自己的OnSeekBarChangeListener 监听事件
具体操作看如下:
1、继承SeekBar 重写内部的事件和方法
代码如下:
public class seekBarDemo extends SeekBar implements OnTouchListener
2、实现一个线程,当在规定的时间内停住即认为其是一个长按动作
这里实现一个自己的Runable 对象,向Handler 对象发送消息,代码如下:
/** * 为runable 赋值 */ runable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub do { i++; try { Thread.sleep(400); Message msg = hand.obtainMessage(); msg.arg1 = i; msg.sendToTarget(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } while (isStop); } };
之后实现一个handler 对象用来设置该重写View 具有的长按事件
3、实现长按事件的接口函数
/** * 获取一个handler 对象 * @param 0代表onTouch 1代表onChange * @param 视图对象 * @param 进度 * @return 返回一个handler对象 */ public Handler getHandler(final int j, final View v, final int progress) { Handler h = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (j) { case 0: if (msg.arg1 == 3) { if (longClick != null) { longClick.onLongClick(v); } } break; case 1: if (msg.arg1 == 1) { pp = progress; } if (msg.arg1 == 2) { if (pp != progress) { i = 0; } } if (msg.arg1 == 3) { i = 0; if (pp == progress) { if (longClick != null) { longClick.onLongClick(seekBarDemo.this); } } } break; } super.handleMessage(msg); } }; return h; }
4、并为重写的SeekBar 添加自己的OnSeekBarChangeListener 监听事件
这里我们首先定义一个onChange 接口 ,接口中有三未实现的方法,分别代表SeekBar 的三种状态
/** * 进度改变接口 * @author terry * */ public interface onChange { public void onStopTrackingTouch(seekBarDemo seekBar); public void onStartTrackingTouch(seekBarDemo seekBar); public void onProgressChanged(seekBarDemo seekBar, int progress, boolean fromUser); }
实现接口函数:
t
his.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub if (SeekBarChange != null) { SeekBarChange.onStopTrackingTouch(seekBarDemo.this); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub if (SeekBarChange != null) { SeekBarChange.onStartTrackingTouch(seekBarDemo.this); } } @Override public void onProgressChanged(final SeekBar seekBar, final int progress, boolean fromUser) { if (SeekBarChange != null) { SeekBarChange.onProgressChanged(seekBarDemo.this, progress, fromUser); } hand = getHandler(1, seekBarDemo.this, progress); } });
完整的参考代码如下:
package org.lytsing.android.qzoneloading; import android.content.Context; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.SeekBar; public class seekBarDemo extends SeekBar implements OnTouchListener { private onLong longClick; /** * 长按接口 * @author terry * */ public interface onLong { public boolean onLongClick(View v); } private onChange SeekBarChange; /** * 进度改变接口 * @author terry * */ public interface onChange { public void onStopTrackingTouch(seekBarDemo seekBar); public void onStartTrackingTouch(seekBarDemo seekBar); public void onProgressChanged(seekBarDemo seekBar, int progress, boolean fromUser); } private Handler hand; private Runnable runable; private Thread th; public static int i = 0; private boolean isStop = false; public static int pp = 0; public int index = 0; public seekBarDemo(Context context) { this(context, null); // TODO Auto-generated constructor stub } public seekBarDemo(Context context, AttributeSet attrs) { super(context, attrs); this.setOnTouchListener(this); this.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub if (SeekBarChange != null) { SeekBarChange.onStopTrackingTouch(seekBarDemo.this); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub if (SeekBarChange != null) { SeekBarChange.onStartTrackingTouch(seekBarDemo.this); } } @Override public void onProgressChanged(final SeekBar seekBar, final int progress, boolean fromUser) { if (SeekBarChange != null) { SeekBarChange.onProgressChanged(seekBarDemo.this, progress, fromUser); } hand = getHandler(1, seekBarDemo.this, progress); } }); /** * 为runable 赋值 */ runable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub do { i++; try { Thread.sleep(400); Message msg = hand.obtainMessage(); msg.arg1 = i; msg.sendToTarget(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } while (isStop); } }; } /** * 获取一个handler 对象 * @param 0代表onTouch 1代表onChange * @param 视图对象 * @param 进度 * @return 返回一个handler对象 */ public Handler getHandler(final int j, final View v, final int progress) { Handler h = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (j) { case 0: if (msg.arg1 == 3) { if (longClick != null) { longClick.onLongClick(v); } } break; case 1: if (msg.arg1 == 1) { pp = progress; } if (msg.arg1 == 2) { if (pp != progress) { i = 0; } } if (msg.arg1 == 3) { i = 0; if (pp == progress) { if (longClick != null) { longClick.onLongClick(seekBarDemo.this); } } } break; } super.handleMessage(msg); } }; return h; } /** * 设置长按事件 * @param longClick */ public void setOnLongSeekBarClick(onLong longClick) { this.longClick = longClick; } /** * 设置进度改变事件 * @param change */ public void setOnSeekBarChange(onChange change) { this.SeekBarChange = change; } @Override public boolean onTouch(final View v, MotionEvent event) { // TODO Auto-generated method stub switch (event.getAction()) { case MotionEvent.ACTION_DOWN: isStop = true; th = new Thread(runable); th.start(); i = 0; hand = getHandler(0, v, 0); break; case MotionEvent.ACTION_UP: isStop = false; break; } return false; } }
在布局的XML可以如下定义:
<org.lytsing.android.qzoneloading.seekBarDemo android:max="200" android:id="@+id/seek" android:layout_width="fill_parent" android:layout_height="wrap_content"> </org.lytsing.android.qzoneloading.seekBarDemo>
本人对该例子的学习笔记:
1、重写接口事件,如本例子中的onChange事件就是用来覆盖SeekBar中的OnSeekBarChangeListener事件,自定义的事件的方法和原来的方法名称一样,然后在原来的事件中调用自定义事件对应的方法。
2、长按事件的触发必定先触发onTouch()事件,于是可以在OnTouch()事件中启动线程,并让该线程睡眠400毫秒,结合isStop(长按时为true,放开的话就变成false了)变量就可以知道长按了多长时间。
3、该例子中用pp变量判断是否是按在同一个地方。
发表评论
-
system挂载为rw
2011-07-28 15:07 2822adb shell #su #mount -o remou ... -
制作TextView的倒影
2011-07-19 13:52 2069package com.javaeye.graphics; ... -
Androkd开发坏境配置以及常用插件
2011-06-21 10:39 1124步骤: 1、安装jdk,并配置环境变量 2、解压android ... -
Android的selector,背景选择器
2011-05-22 11:50 1742首先android的selector是在drawable/xx ... -
PUSH机制
2011-04-20 13:54 13091、长连接 2、Android and XMPP htt ... -
ListView快速滑动搜索
2011-04-14 10:16 1268相关资料: Android-ListView快速滚动示例增加首 ... -
Android源码编译全过程
2011-03-18 09:39 83191, ubuntu 下源码编译 最好切换到root用户下进行操 ... -
测试环境Hosts设置
2011-02-25 18:25 1809设置方法: //启动虚拟手机并更改分区大小为128M emul ... -
Activity的launchMode
2011-01-16 17:02 852请看博客:http://marshal.easymorse.c ... -
android多分辨力支持 密度与分辨力
2010-12-29 15:37 1235关于Android的分辨率支持,为大家翻译官方文档 看世界杯的 ... -
用shape美化控件
2010-12-29 10:34 928如果你对Android系统自带的UI控件感觉不够满意, ... -
Android知识积累
2010-12-28 13:44 1007引用系统资源: android:textColor=& ... -
自定义对话框Dialog
2010-12-16 16:55 1527提醒对话框: 布局文件:alertdialog.xml < ... -
Dialog
2010-12-16 14:45 10941. 创建对话框 1. Showing ... -
Android 文件系统的结构
2010-11-06 22:56 10421、Android 文件系统的结构 Android源码编译后 ... -
DB和File工具类
2010-11-01 15:46 1544DB工具类: import java.io.B ... -
打造自己的动画效果
2010-10-29 14:25 1003当我们的软件基本功能都实现了之后,我们是不是还可以把它做的更好 ... -
画图,Shader Path
2010-10-28 16:42 1272package com.javaeye.android.my; ... -
Google API应用
2010-10-27 16:21 1619获取Location Provider: android lo ... -
使用SoundPool播放游戏音效
2010-10-12 15:51 1782在Android开发中我们经常使用MediaPlayer来播放 ...
相关推荐
在Android开发中,SeekBar是一个非常常用的控件,它允许用户通过滑动来选择一个值,通常用于音量调节、进度调整等场景。然而,标准的SeekBar控件有时不能满足所有需求,开发者可能需要对其进行定制以适应特定的应用...
在 Android 中,我们可以通过设置OnClickListener 和 OnLongClickListener 来实现按钮的点击事件和长按事件。但是,如何区分点击事件和长按事件,避免冲突,是我们需要解决的问题。 在 Android 中,我们可以通过...
目录 问题描述 原因分析 ...在Android 10等高版本系统机型上Seekbar的拖拽按钮展示正常,但是在比如Android5.1系统上展示异常。异常现象是拖拽按钮偏离了轨道中心位置,拖拽按钮顶部紧贴控件的顶部边界。
"android_listview2"可能包含了如何使用Adapter填充数据、实现点击事件、长按事件以及自定义适配器的实例。 7. **GridView**: GridView呈现二维网格布局的视图,适用于图片库或菜单。"android_gridview"的源码...
在Android平台上,录音功能是应用程序...通过以上步骤,你可以实现一个基本的Android录音实时监控音量大小的功能。当然,实际应用可能需要根据具体需求进行更复杂的调整和优化,例如添加音量平滑处理、音量阈值判断等。
- 在触摸事件中判断是否开始旋转,以及旋转的时机和方式,比如长按开始,松开结束。 5. **交互反馈**: - 添加音效,如点击声、旋转声和中奖提示音,提升用户体验。 - 结束动画后,显示中奖信息,可以用`...
自定义View可能需要处理触摸事件,比如当用户长按SeekBar时,可以显示一个对话框让用户精确调整音量。这需要在自定义View中覆写`onTouchEvent()`方法。 6. **实现音量对话框** 除了在界面上提供一个SeekBar外,还...
学习这些控件,包括CardView、FloatingActionButton等,能让你的应用符合最新的设计标准。 4. **Android视频源代码之ListView.zip**: ListView是Android中显示大量数据的列表视图。理解如何使用Adapter填充...
【Android中文翻译组android.widget合集】是一个针对Android开发者的宝贵资源集合,主要涵盖了`android.widget`包中的组件和相关知识点。这个合集包括了电子书、源代码和其他相关文档,帮助开发者深入理解和掌握...
在Android应用开发中,控件是构建用户界面的基础元素,它们负责展示信息并接收用户的交互。这个"Android 多种android控件的Demo.zip"压缩包包含了一系列Android控件的示例代码,非常适合开发者进行参考和学习。让...
- `OnLongClickListener`接口处理长按事件。 7. **响应式设计**: - 使用`dp`和`sp`单位,确保在不同尺寸屏幕上的适配。 - `dimens.xml`文件为不同屏幕尺寸定义尺寸资源。 - `sw<N>dp`配置文件处理屏幕宽度变化...
为了优化控制杆占用的控件空间,开发者可能采用了自定义视图或者扩展现有的Android `SeekBar`或`SeekBarCompat`控件。这些控件通常用于滑动选择,但通过自定义,可以改造为具有游戏操控感的虚拟摇杆。通过调整布局...
综上所述,"Android手势调节音量,亮度,进度"这个项目涵盖了Android开发中的多点触控手势识别、系统资源控制(音量、亮度)、UI组件(如SeekBar)的使用以及程序调试等多个知识点,为Android开发者提供了一个实用的...
总结来说,"Android 自定义可以滑动和点击的RangeBar"是一个实用的自定义组件,它的实现涉及到Android事件处理、布局设计、自定义视图的绘制以及交互逻辑等多个方面。通过学习和实践这个案例,开发者不仅可以掌握...
在Android平台上,开发一款仿微信语音聊天的应用是一项技术性较强的任务。这个项目涉及到多个关键知识点,包括音频录制、音频处理、网络传输、播放控制以及用户界面设计等。下面将逐一详细解析这些关键技术。 首先...
- **安装Eclipse的Android插件(ADT)**:在Eclipse中,需要安装Android Developer Tools (ADT) 插件来增强其对Android开发的支持。可以通过Eclipse的帮助菜单中的“Install New Software”选项来添加Google的ADT...
在Android平台上,实现类似微信的录音功能是一项常见的需求,它涉及到多媒体处理、用户交互以及音频录制等技术。在这个毕业设计项目中,我们将深入探讨如何在Android应用中构建一个高效的录音功能,模仿微信的录音...
《Android人机界面指南》是一本深入探讨Android操作系统中用户界面设计与开发的参考资料。它旨在帮助开发者理解和创建高效、直观且美观的Android应用界面,从而提升用户体验。在这个指南中,我们将涵盖多个关键知识...