索引ListView

   项目需求,做了这个,现在把我写到代码贴出来把

   先贴出布局文件吧,很简单的分分钟写出来。

<com.huangdi.indexlistview.IndexListView
       android:layout_width="50dp"
       android:id="@+id/index_listview"
       android:layout_height="match_parent" />
   <TextView
       android:layout_width="80dp"
       android:layout_centerInParent="true"
       android:id="@+id/tv_zimu"
       android:textSize="30dp"
       android:background="#888888"
       android:gravity="center"
       android:textColor="#ffffff"
       android:visibility="gone"
       android:layout_height="100dp" />
 接着贴出IndexView

 先贴出关键代码绘制方法 onDraw();

 

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for(int i  =0 ;i<ZIMU.length;i++){
            if(index==i){
                //调用了界面重绘后重写绘制字母,这是点击字母以后绘制的,颜色为红色
                canvas.drawText(ZIMU[i], 0, ZIMU[i].length(), width / 4, (height / ZIMU.length) * (i + 1) - 3, mClickPaint);
            }else{
<span style="white-space:pre">		</span>//这是没有点击的时候状态,默认为gray
                 canvas.drawText(ZIMU[i], 0, ZIMU[i].length(), width / 4, (height / ZIMU.length) *(i + 1) - 3, mTextPaint);
            }
        }
    }
 在贴出初始化画笔

<span style="white-space:pre">	</span>//绘制默认状态的画笔
 <span style="white-space:pre">	</span>mTextPaint = new Paint();
<span style="white-space:pre">	</span>//绘制点击以后的画笔
        mClickPaint = new Paint();
        mTextPaint.setTextSize(ZIMU.length);
        mTextPaint.setAntiAlias(true);
        mTextPaint.setTextAlign(Paint.Align.CENTER);
        mTextPaint.setColor(Color.GRAY);
        mTextPaint.setTextScaleX(1.5f);
        mClickPaint.setTextSize(ZIMU.length);
        mClickPaint.setAntiAlias(true);
        mClickPaint.setTextAlign(Paint.Align.CENTER);
        mClickPaint.setColor(Color.RED);
        mClickPaint.setTextScaleX(1.5f);
 贴出点击字母事件的代码ontouch;

 

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_DOWN:
            //等到点击的索引然后调用界面重绘
            index = (int) (event.getY()/(height/ZIMU.length));
            if(onZiMuSelectListener!=null){
                onZiMuSelectListener.onItemSelect(index,ZIMU[index]);
            }
            invalidate();
            return true;
    }
    return super.onTouchEvent(event);
}
package com.huangdi.indexlistview;

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;

/**
 * 自定义View作为索引
 * Created by huangdi on 15/9/30.
 */
public class IndexListView extends View {
    private Paint mTextPaint;
    private Paint mClickPaint;
    private int width,height;
    private String ZIMU[] ={"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"
    };
    //点击的索引默认为没有点击所以为-1
    private int index = -1;
    public IndexListView(Context context) {
        super(context);
    }

    public IndexListView(Context context, AttributeSet attrs) {
        super(context, attrs);

        mTextPaint = new Paint();
        mClickPaint = new Paint();
        mTextPaint.setTextSize(ZIMU.length);
        mTextPaint.setAntiAlias(true);
        mTextPaint.setTextAlign(Paint.Align.CENTER);
        mTextPaint.setColor(Color.GRAY);
        mTextPaint.setTextScaleX(1.5f);
        mClickPaint.setTextSize(ZIMU.length);
        mClickPaint.setAntiAlias(true);
        mClickPaint.setTextAlign(Paint.Align.CENTER);
        mClickPaint.setColor(Color.RED);
        mClickPaint.setTextScaleX(1.5f);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //拿到宽度和高度
        width = getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec);
        setMeasuredDimension(width, height);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for(int i  =0 ;i<ZIMU.length;i++){
            if(index==i){
                //调用了界面重绘后重写绘制字母
                canvas.drawText(ZIMU[i], 0, ZIMU[i].length(), width / 4, (height / Z	IMU.length) * (i + 1) - 3, mClickPaint);
            }else{
                canvas.drawText(ZIMU[i], 0, ZIMU[i].length(), width / 4, (height / Z	IMU.length) * (i + 1) - 3, mTextPaint);
            }
        }
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_DOWN:
                //等到点击的索引然后调用界面重绘
                index = (int) (event.getY()/(height/ZIMU.length));
                if(onZiMuSelectListener!=null){
                    onZiMuSelectListener.onItemSelect(index,ZIMU[index]);
                }
                invalidate();
                return true;
        }
        return super.onTouchEvent(event);
    }
    interface  OnZiMuSelectListener {
        void onItemSelect(int index,String zimuStr);
    }
    private OnZiMuSelectListener onZiMuSelectListener ;

    public void setOnZiMuSelectListener(OnZiMuSelectListener onZiMuSelectListener) {
        this.onZiMuSelectListener = onZiMuSelectListener;
    }
}

效果图如下

  

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值