字母导航条自定义View

来源:互联网 发布:能飞背单词软件 编辑:程序博客网 时间:2024/05/16 10:49
<span style="font-family: Arial, Helvetica, sans-serif;">LetterView.java</span>
public class LetterView extends View {// 1.0继承Viewpublic 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;@Overrideprotected 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
原创粉丝点击