首先画出26 个字母
1.画出26个字母首先需要一个字符数组,里面的包含了26个英文字母
2.设置字母的高度为当前View的总高度除以float类型的26,设置字母显示位置,横坐标是当前View 的宽度减去一个字母的宽度,这样可以让字母显示到View 的右边缘上,纵坐标是根据字母的高度,往下累加(见代码)
3.利用for循环绘制出26个字母
点击字母时确定点击的是哪个字母,点击是更换颜色
1.复写onTouchEvent方法,然后 switch (event.getAction()),需要case 的有三个参数
2.第一个参数MotionEvent.ACTION_DOWN:表示当按下时的操作
3.第二个参数MotionEvent.ACTION_MOVE:表示当移动时的操作(手在手机屏幕上移动时的操作)
4第三个参数MotionEvent.ACTION_UP:表示抬起来的操作(手离开手机屏幕时)
5.在MotionEvent.ACTION_DOWN:下面进行左边判断,首先通过event.getX()和event.getY()得到点击时的坐标,然后x轴的坐标是否是在这一列上,然后再用y的坐标值除以当个字母的高度,然后强制造型成为int类型index,index对应string数组中的对应的字母,就是点击到的字母
6.将index换成全局变量赋初始值为-1,(默认为什么都没有选),当点击时根据第5步,将重新给index赋值,将这个值在onDraw方法中做判断如果i==index就将该字母变为蓝色(改变Paint颜色即可)其他的不变
7.在第三个参数MotionEvent.ACTION_UP下重写将index=-1;表示当手离开屏幕时默认不选择
观察者模式通过点击字母将所选择的字母显示在TextView上
1.首先写一个接口里面写入一个方法,在该方法中传入当前点击字母位置,和字母
public interface OnItemSelect{
public void OnItemSelected(int index,String indexString);
}
2.创建一个对象
private OnItemSelect listener;
3.设置该对象的set方法,将该对象传入
public OnItemSelect setOnItemListener(OnItemSelect listener) {
this.listener=listener;
return listener;
}
4.在MotionEvent.ACTION_DOWN:下调用该对象,并将数值传入
if (listener!=null) {
listener.OnItemSelected(index, array[index]);
}
5.在Activity中
mySlider.setOnItemListener(new MySlider.OnItemSelect() {
@Override
public void OnItemSelected(int index, String indexString) {
mTextView.setText(indexString);
}
});
代码实现
public class MySlider extends View {
private int width;
private int heigth;
private Paint mPaint;
private Paint mPaintBule;
private long x;
private long y;
private int index=-1;
String[] array={"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"};
public MySlider(Context context) {
super(context);
}
public interface OnItemSelect{
public void OnItemSelected(int index,String indexString);
}
private OnItemSelect listener;
public OnItemSelect setOnItemListener(OnItemSelect listener) {
this.listener=listener;
return listener;
}
public MySlider(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint=new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setTextAlign(Paint.Align.CENTER);//设置为居中的格式
mPaintBule=new Paint();
mPaintBule.setColor(Color.BLUE);
mPaintBule.setTextAlign(Paint.Align.CENTER);
}
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
heigth = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, heigth);
//必须先测量height然后在设置
mPaint.setTextSize(heigth/26f);
mPaintBule.setTextSize(heigth/26f);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
x= (long) event.getX();
y= (long) event.getY();
switch (event.getAction()){
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_DOWN:
if (x>width-width-mPaint.measureText("m")*2){
index=(int)y/(heigth/26);
Log.d("index","点击到的是"+array[index]);
if (listener!=null) {
listener.OnItemSelected(index, array[index]);
}
invalidate();
return true;//必须要return否则不管用
}
break;
case MotionEvent.ACTION_UP:
index=-1;
invalidate();
break;
default:
break;
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i=0;i<array.length;i++){
if(i==index){
canvas.drawText(array[i],width-mPaint.measureText("m"),heigth/26f*(i+1),mPaintBule);
}else {
canvas.drawText(array[i], width - mPaint.measureText("m"), heigth / 26f * (i + 1), mPaint);
}
}
}
}
public class SliderActivity extends AppCompatActivity {
private TextView mTextView;
private MySlider mySlider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.slider);
mTextView= (TextView) findViewById(R.id.textview_item);
mySlider= (MySlider) findViewById(R.id.my_slider);
mySlider.setOnItemListener(new MySlider.OnItemSelect() {
@Override
public void OnItemSelected(int index, String indexString) {
mTextView.setText(indexString);
}
});
// mTextView.setText("d");
}
}