自定义View画出手机通讯录中右边字母,并设置TouchEvent/观察者模式

来源:互联网 发布:翻译软件app 编辑:程序博客网 时间:2024/06/06 14:24

首先画出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");    }}
0 0
原创粉丝点击