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