SideBar

来源:互联网 发布:网红淘宝店铺排行榜 编辑:程序博客网 时间:2024/05/15 03:45

这里写图片描述

<?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.example.x6.sidebardemo.MainActivity">    <com.example.x6.sidebardemo.SideBar        android:id="@+id/slidBar"        android:layout_width="20dp"        android:layout_height="match_parent"        android:layout_alignParentRight="true"        />    <TextView        android:id="@+id/showTv"        android:layout_width="100dp"        android:layout_height="100dp"        android:text=""        android:textSize="60sp"        android:gravity="center"        android:background="@color/colorBlue"        android:visibility="invisible"        android:textColor="@color/colorAccent"        android:layout_centerInParent="true"/></RelativeLayout>
public class MainActivity extends AppCompatActivity implements ISideBar{    private TextView showTv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        SideBar bar = (SideBar) findViewById(R.id.slidBar);        bar.setListener(this);        showTv = (TextView) findViewById(R.id.showTv);    }    @Override    public void onTouchLetterChanged(String s) {        showTv.setText(s);        showTv.setVisibility(View.VISIBLE);    }    @Override    public void onTouchUpInVisibility() {        showTv.setText("");        showTv.setVisibility(View.INVISIBLE);    }}
public class SideBar extends View {    private ISideBar listener;    private String[] b = {"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 paint = new Paint();    private int height;    private int width;    private int index = -1;    public SideBar(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    protected void onFinishInflate() {        super.onFinishInflate();    }    public void setListener(ISideBar listener){        this.listener = listener;    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        /**         *  在onFinishInflate() 之后才能获取宽高         */        height = getHeight();                           //获取高        width = getWidth();                             //获取宽        int singleHeight = height / b.length;           //每个字母的高度        for (int i = 0; i < b.length; i++) {            if(index == i){                paint.setColor(Color.rgb(70, 171, 255));            }else{                paint.setColor(Color.rgb(00, 00, 00));            }              //设置文字的颜色            paint.setTypeface(Typeface.DEFAULT_BOLD);   //粗体            paint.setAntiAlias(true);                   //光滑            paint.setTextSize(50);            int x = 0;            int y = singleHeight * (i + 1);            canvas.drawText(b[i], x, y, paint);            paint.reset();        }    }    /*     * dispatchTouchEventonTouchEvent 区别     * dispatchTouchEvent是用来分发事件的,onTouchEvent是用来处理事件的。     * 先走dispatchTouchEvent然后走onTouchEvent。     * View不执行 onInterceptTouchEvent     */    @Override    public boolean onTouchEvent(MotionEvent event) {        int action = event.getAction();        float y = event.getY();                     //获取手指在控件上触摸的y坐标        index =   (int) (y/height*b.length);        // 当前点击的字母        switch (action) {            case MotionEvent.ACTION_UP:                index = -1;                invalidate();                if(listener != null){                    //隐藏弹出字母                    listener.onTouchUpInVisibility();                }                break;            default:                if(listener != null){                    if(index<0 || index >= b.length)return true;                        listener.onTouchLetterChanged(b[index]);                }                invalidate();                break;        }        return true;    }}
1 0