Android之实现单边快速查找效果
来源:互联网 发布:最实用的端口映射软件 编辑:程序博客网 时间:2024/04/30 08:34
在许多应用场景下,实现快速定位会提升用户体验。如在通讯录的应用下,右边悬浮着一个快速查找的组件,手指滑动到相对应的字符上就会显示相应的内容。在这里,我只是对实现手指滑动获得内容的效果作简短说明,具体业务,看具体应用场景。
1、首先自定义一个AlphaView类,继承ImageView。
package org.zqy.quickfind;import android.content.Context;import android.graphics.Canvas;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.ImageView;public class AlphaView extends ImageView {private Drawable alphaDrawable;private boolean showBkg; // 是否显示背景private int choose; // 当前选中首字母的位置private String[] ALPHAS;private OnAlphaChangedListener listener;public AlphaView(Context context) {super(context);initAlphaView();}public AlphaView(Context context, AttributeSet attrs) {super(context, attrs);initAlphaView();}public AlphaView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initAlphaView();}private void initAlphaView() {showBkg = false;choose = -1;setImageResource(R.drawable.alpha_normal);alphaDrawable = getDrawable();ALPHAS = new String[28];ALPHAS[0] = " "; // " "代表搜索ALPHAS[27] = "#";for (int i = 0; i < 26; i++) {ALPHAS[i + 1] = String.valueOf((char) (65 + i));}}@Overrideprotected void onDraw(Canvas canvas) {if (showBkg) {setImageResource(R.drawable.alpha_pressed);alphaDrawable = getDrawable();alphaDrawable.setBounds(0, 0, getWidth(), getHeight());} else {setImageResource(R.drawable.alpha_normal);alphaDrawable = getDrawable();alphaDrawable.setBounds(0, 0, getWidth(), getHeight());}canvas.save();alphaDrawable.draw(canvas);canvas.restore();}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {final float y = event.getY();final int oldChoose = choose;final int c = (int) (y / getHeight() * 28);// 获取点击的位置的字母的代号switch (event.getAction()) {case MotionEvent.ACTION_DOWN:showBkg = true;if (oldChoose != c && listener != null) {if (c >= 0 && c < ALPHAS.length) {listener.OnAlphaChanged(ALPHAS[c], c);choose = c;}}invalidate();break;case MotionEvent.ACTION_MOVE:if (oldChoose != c && listener != null) {if (c >= 0 && c < ALPHAS.length) {listener.OnAlphaChanged(ALPHAS[c], c);choose = c;}}invalidate();break;case MotionEvent.ACTION_UP:showBkg = false;choose = -1;invalidate();break;}return true;}// 设置事件public void setOnAlphaChangedListener(OnAlphaChangedListener listener) {this.listener = listener;}// 事件接口public interface OnAlphaChangedListener {public void OnAlphaChanged(String s, int index);}}
2、在Activity中简单使用
package org.zqy.quickfind;import org.zqy.quickfind.AlphaView.OnAlphaChangedListener;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.view.WindowManager;import android.view.ViewGroup.LayoutParams;import android.widget.TextView;import android.app.Activity;import android.content.Context;import android.graphics.PixelFormat;public class MainActivity extends Activity implements OnAlphaChangedListener {private AlphaView av;private TextView tv;// 用于展示private WindowManager windowManager;private Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);av = (AlphaView) findViewById(R.id.av);// 找到右边的快速查找组件av.setOnAlphaChangedListener(this);tv = new TextView(this);// 初始化展示组件tv.setWidth(80);tv.setHeight(80);tv.setTextSize(30);// 设置字体大小WindowManager.LayoutParams lp = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_APPLICATION,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,PixelFormat.TRANSLUCENT);windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);windowManager.addView(tv, lp);tv.setVisibility(TextView.GONE);// 默认不可见}// 设置tv不可见private class TvThread implements Runnable {@Overridepublic void run() {tv.setVisibility(View.GONE);}}private TvThread tvThread = new TvThread();/** * 回调函数,获得当前的字符和位置 */@Overridepublic void OnAlphaChanged(String s, int index) {tv.setVisibility(View.VISIBLE);handler.postDelayed(tvThread, 800);tv.setText(s);// 可以根据得到的字符去处理相应的业务......}}
3、对应的布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <org.zqy.quickfind.AlphaView //使用自定义的view组件 android:id="@+id/av" android:layout_width="20dp" android:layout_height="match_parent" android:layout_alignParentRight="true" /></RelativeLayout>
4、效果图
5、源码地址
http://pan.baidu.com/s/11P3jb#dir/path=%2F%E6%88%91%E7%9A%84Android%E7%A4%BA%E4%BE%8B%E7%A8%8B%E5%BA%8F%E4%BB%A3%E7%A0%81
- Android之实现单边快速查找效果
- 快速排序--双边扫描与单边扫描的实现
- android快速实现毛玻璃效果
- android快速实现毛玻璃效果
- Android快速实现毛玻璃效果
- 快速排序(单边调换)
- Android快速毛玻璃虚化效果实现
- Android快速实现动态模糊效果
- Android 仿微信“正在输入...”效果快速实现
- Android 快速实现右滑退出效果
- CSS3之------box-shadow属性使用方法(1),即单边阴影效果设置
- 算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描
- IOS UIView 设置单边实现
- Android ListView快速查找
- 数据结构之二分法查找、快速排序思想与实现
- 数据结构之二分法查找、快速排序思想与实现
- Android实现列表仿联系人快速查找和关键字搜索
- android实现类似于支付宝余额快速闪动的效果
- muduo_net库源码分析(26-1
- 在100---1000以内所有水仙花数
- UVA 571 (13.11.06)
- 政府、公积金服务电话
- EpollPoller --- muduo_net库源码分析(27)
- Android之实现单边快速查找效果
- mac在线恢复教程
- TCMalloc介绍
- Python中引入自定义路径下的用户自定义类
- Delphi视频教程:黑客基地delphi特训班
- NumPy学习笔记--入门篇
- ios中UIScrollview和Tableviewde 的嵌套使用
- EventLoop再分析之IO线程(29)
- sicily9161