• 28自定义View 模仿联系人字母侧栏


    这里写图片描述

    这里写图片描述

    自定义View
    LetterView.java

    package com.qf.sxy.customview02;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.TextView;
    
    /**
     * Created by sxy on 2016/9/29.
     */
    public class LetterView extends View {
    
        // 索引的字母
        public  static final String[] LETTES ={"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"};
    
        private Paint mTextPaint;
        //指定一个位置  不在索引范围内
        private int pressedPosition = -1;
    
        //获取展示的View
        private TextView mSelectView;
        public void setSelectTextView(TextView tv){
            this.mSelectView = tv;
        }
    
        public LetterView(Context context, AttributeSet attrs) {
            super(context, attrs);
            //初始化画笔
            initPaint();
        }
    
        private void initPaint() {
            mTextPaint = new Paint();
            mTextPaint.setAntiAlias(true);
            mTextPaint.setColor(Color.RED);
            mTextPaint.setTextSize(30);
        }
    
        public LetterView(Context context) {
            this(context,null);
        }
    
    
    
    
        /**
         * 进行绘制
         * @param canvas
         */
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            //获取 宽和高
            int height = getHeight();
            int width = getWidth();
            //字符串序列的长度
            int lettersLength = LETTES.length;
            //获取每个字符的高度
            int singleHeight = height/lettersLength;
    
            //开始绘制
            for(int i=0;i<lettersLength;i++){
                //获取x的位置
                int xPos = (int)(width/2-mTextPaint.measureText(LETTES[i])/2);
                //获取Y的位置
                int yPos = singleHeight+i*singleHeight;
                //设置文字颜色
                if(pressedPosition == i){
                    mTextPaint.setColor(Color.BLUE);
    
                }else{
                    mTextPaint.setColor(Color.BLACK);
                }
                //绘制文本
                canvas.drawText(LETTES[i],xPos,yPos,mTextPaint);
            }
        }
    
        /**
         * 触摸事件
         *
         * true  消费事件  false 不处理
         * @param event
         * @return
         */
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN://按下
                case MotionEvent.ACTION_MOVE://移动
                    //获取手指的Y位置
                    float eventY = event.getY();
                    //每个字母单独的高度
                    int singleHeight = getMeasuredHeight()/LETTES.length;
                    //获取你当前索引位置
                    pressedPosition = (int)(eventY/singleHeight);
                    //显示提示的VIew  设置内容
                    if(mSelectView!=null){
                        if(pressedPosition>=0&&pressedPosition<LETTES.length){
                            mSelectView.setVisibility(View.VISIBLE);
                            mSelectView.setText(LETTES[pressedPosition]);
                        }
                    }
    
    
                    invalidate();//刷新
    
                    break;
                case  MotionEvent.ACTION_UP://抬起
                    //还原当前位置
                    pressedPosition = -1;
                    //隐藏提示的View
                    if (mSelectView!=null){
                        mSelectView.setVisibility(View.GONE);
                    }
    
    
                    invalidate();//刷新
    
                    break;
            }
    
    
            return true;
        }
    }
    

    MainActivity.java

    package com.qf.sxy.customview02;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
    
        private TextView tv;
        private LetterView letterView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            tv = ((TextView) findViewById(R.id.select_tv));
            letterView = ((LetterView) findViewById(R.id.letterView));
    
            //传递展示的View
            letterView.setSelectTextView(tv);
        }
    }
    

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.qf.sxy.customview02.MainActivity">
    
        <com.qf.sxy.customview02.LetterView
            android:id="@+id/letterView"
            android:layout_width="40dp"
            android:layout_height="match_parent"
            android:layout_alignParentRight="true"
          />
    
        <TextView
            android:id="@+id/select_tv"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:background="#00ff00"
            android:textSize="30sp"
            android:visibility="gone"
            android:text="A"
            />
    </RelativeLayout>
    
  • 相关阅读:
    20200721_34代码如何优化以及框架的运用和构建设计
    20200719_33appium应用及H5页面元素定位下
    20200709_29多线程与分布式
    day4_day4_python
    python_day3
    python第二天
    pytihon初学第一天
    移动平均线系列
    网页爬取
    十种经典排序算法
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152165.html
Copyright © 2020-2023  润新知