字母导航条自定义View

<span style="font-family: Arial, Helvetica, sans-serif;">LetterView.java</span>
 
public class LetterView extends View {// 1.0继承View
	public LetterView(Context context) {// 1.1实现构造函数
		super(context);
	}
	public LetterView(Context context, AttributeSet attrs) {// 1.2实现构造函数
		super(context, attrs);
	}
	private static String[] letter = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
			"S", "T", "U", "V", "W", "X", "Y", "Z", "#"};// 1.3 26个字母导航条
	private OnTouchingLetterChangedListener onTouchingLetterChangedListener;// 1.4监听事件
	private Paint paint;// 1.5画笔
	private TextView mTextDialog;// 1.6表示某个字母被选择,弹出显示
	public void setmTextDialog(TextView mTextDialog) {// 1.7表示某个字母被选择,弹出显示--提供Set方法
		this.mTextDialog = mTextDialog;
	}
	protected void onDraw(Canvas canvas) {// 2.0重写该方法,类似一个黑板,在里面绘制东西
		super.onDraw(canvas);
		int width = getWidth();// 2.1获取View的高度和宽度
		int height = getHeight();
		int letterLength = letter.length;// 2.2字母数量
		int letterHeight = height / letterLength;// 2.3每个字母的高度
		paint = new Paint();// 2.4初始化画笔
		for (int i = 0; i < letterLength; i++) {
			paint.setTextSize(letterHeight * 4 / 5);
			paint.setAntiAlias(true);// 设置画笔是否使用抗锯齿(使用会消耗较大资源)
			float xPos = width - letterHeight;// 靠近屏幕右边减去字母的高度
			float yPos = letterHeight * i + letterHeight;
			canvas.drawText(letter[i], xPos, yPos, paint); // 2.4开始绘制
			// paint.reset(); // 重置画笔
		}
	}

	public boolean dispatchTouchEvent(MotionEvent event) {// 3.0监听事件
		int action = event.getAction();// 3.1获取事件类型
		float yPosCurrent = event.getY();// 获取被点击时的Y坐标
		int letterCurrent = (int) (yPosCurrent / getHeight() * letter.length);// 计算被点击字母的位置
		OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;
		// 例如点击的是中间位置, 50/100*字母个数...得到的是中间字母位置
		switch (action) {
			case MotionEvent.ACTION_UP :// 当手指抬起的时候
				setBackgroundDrawable(new ColorDrawable(0x00000000));
				mTextDialog.setVisibility(View.GONE);
				// invalidate();// 刷新View,调用此方法后,系统会自动回调onDraw方法,重新描绘控件
				break;
			default :// 当触摸或点击,长按
				setBackgroundDrawable(new ColorDrawable(0x551245ff));
				if (letterCurrent >= 0 && letterCurrent < letter.length) {
					if (listener != null) {
						listener.onTouchingLetterChanged(letter[letterCurrent]);
					}
					mTextDialog.setText(letter[letterCurrent]);
					mTextDialog.setVisibility(View.VISIBLE);
				}
				// invalidate();
				break;
		}
		return true;// 3.0返回true,不然会调用系统的回调
	}
	// 这是接口对外公开的方法
	public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
		this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
	}

	// 如果想要监听导航条的操作,那么需要自定义一个导航条监听事件,回调
	public interface OnTouchingLetterChangedListener {
		public void onTouchingLetterChanged(String letter);
	}

}
</pre><pre name="code" class="java"><pre name="code" class="java">public class MainActivity extends Activity {
	private Context context;
	private LetterView letterview;
	private TextView textView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		context = this;
		setContentView(R.layout.activity_main);
		InitLetterView();
	}
	private void InitLetterView() {
		textView = (TextView) this.findViewById(R.id.textView);
		letterview = (LetterView) this.findViewById(R.id.letterview);
		letterview.setmTextDialog(textView);
	}

}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值