一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Android自定义View仿微信LetterView效果

时间:2017-05-18 编辑:简简单单 来源:一聚教程网

 

 代码如下复制代码

publicclassLetterViewextendsView {

  privateString TAG = LetterView.class.getSimpleName();

  //A,B,C....Z,#

  publicListletters;

  privatePaint mPaint;

  privateintselectPosition = -1;

  privateTextView mLetter;

  publicvoidsetmLetter(TextView mLetter) {

    this.mLetter = mLetter;

  }

  publicLetterView(Context context) {

    this(context,null);

  }

  publicLetterView(Context context, AttributeSet attrs) {

    this(context, attrs,0);

  }

  publicLetterView(Context context, AttributeSet attrs,intdefStyleAttr) {

    super(context, attrs, defStyleAttr);

    //生产字母

    letters =newArrayList<>();

    for(inti =65; i<91; i++) {

      letters.add(String.format(Locale.CHINA,"%c",i));

      Log.e(TAG,"LetterView: "+ String.format(Locale.CHINA,"%c",i));

    }

    letters.add("#");//追加一个#

    //初始化画笔

    mPaint =newPaint();

    mPaint.setAntiAlias(true);

    mPaint.setColor(Color.BLUE);

    mPaint.setTextSize(30);

  }

  @Override

  protectedvoidonDraw(Canvas canvas) {

    super.onDraw(canvas);

    /**

     * 获取View的宽度

     * 获取View的高度

     */

    intwidth = getMeasuredWidth();

    intheight = getMeasuredHeight();

    //测量字的宽度

    intsize = letters.size();

    for(inti =0; i < size; i++) {

      floattextWidth = mPaint.measureText(letters.get(i));

      intsingleHeight = height / size;

      if(selectPosition == i){//被选中的

        mPaint.setColor(Color.RED);

      }else{

        mPaint.setColor(Color.BLUE);

      }

      canvas.drawText(letters.get(i),(width - textWidth)/2, singleHeight * (i +1),mPaint);

      /**

       * drawText() x y \_ 为基准线

       */

    invalidate();

    }

  }

  /**

   * Android将触摸事件封装,包装了动作,位置信息;onClick也是一种motionEvent

   * onClick 事件 实际上是 onTouchEvent事件

   * @param event

   * @return

   */

  @Override

  publicbooleanonTouchEvent(MotionEvent event) {

    //包装了动作,位置信息

//    event.getY();//相对于View本身的坐标值

//    event.getRawY();//返回的是相对于屏幕的坐标值

    floaty = event.getY();

    Log.e(TAG,"onTouchEvent: Y:"+ y);

//    Log.e(TAG, "onTouchEvent: RawY:"+event.getRawY() );

    intmeasuredHeight = getMeasuredHeight();

    intsingleHeight = measuredHeight / letters.size();

    intposition = (int) (y / singleHeight);

    Log.e(TAG,"onTouchEvent: "+ position );

    switch(event.getAction()) {

      caseMotionEvent.ACTION_MOVE:

        Log.e(TAG,"onTouchEvent: ACTION_MOVE");

      caseMotionEvent.ACTION_DOWN:

        Log.e(TAG,"onTouchEvent: ACTION_DOWN");

        selectPosition = position;

        if(mLetter !=null) {

          mLetter.setVisibility(View.VISIBLE);

          //极限情况有可能下标越界,需要判断一下

          if(position < letters.size() && position >=0){

            mLetter.setText(letters.get(position));

          }

        }

        break;

      caseMotionEvent.ACTION_UP:

        Log.e(TAG,"onTouchEvent: ACTION_UP");

        selectPosition = -1;

        if(mLetter !=null) {

          mLetter.setVisibility(View.GONE);

        }

        break;

    }

    //返回true代表事件被处理了

    returntrue;

  }

}

 

热门栏目