实现通讯录的检索功能(本例中使用了观察者模式,需要多多用心)

本程序中主要使用View来实现此功能

继承View的程序

package com.test.mypathview;

import android.app.Notification.Action;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class MySlider extends View {
    private int height;
    private int width;
    private Paint mTextPaint;
    private Paint mPaintRed;
    private int index = -1;
    // 定义一个字符数组,来实现右侧栏的显示信息
    private String str[] = { "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 interface OnItemSelect {
        public void onIntemSelected(int index, String indexString);
    }

    // 用接口定义一个全局变量
    private OnItemSelect listener;

    // 通过全局变量改变类中的值,以方便下面的使用
    public void setOnItemSelectListener(OnItemSelect listener) {
        this.listener = listener;
    }

    public MySlider(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTextPaint = new Paint();
        mTextPaint.setTextAlign(Align.CENTER);

        mPaintRed = new Paint();
        mPaintRed.setColor(Color.RED);
        mPaintRed.setTextAlign(Align.CENTER);
    }

    public MySlider(Context context) {
        super(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
                getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
        mTextPaint.setTextSize(height / 26f);
        mPaintRed.setTextSize(height / 26f);
    }

    private float x;
    private float y;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:

        case MotionEvent.ACTION_MOVE:
            x = event.getX();
            y = event.getY();
            if (x > width - mTextPaint.measureText("m") * 1.2 && x < width - mTextPaint.measureText("m") * 0.5) {
                index = (int) y / (height / 26);
                Log.d("aaa", index + "");
                // 因为Listener在上面已经赋值,所以可以直接使用接口中的方法
                if (listener != null) {
                    listener.onIntemSelected(index, str[index]);
                }
                // 改变值后立即提示系统进行刷新
                invalidate();
                return true;
            }
            break;
        case MotionEvent.ACTION_UP:
            //当手离开时,将index设为默认值
            index = -1;
            invalidate();
            return true;

        default:
            break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int i = 0; i < 26; i++) {
            if (index == i) {
                canvas.drawText(str[i], width - mTextPaint.measureText("m"), height / 26 * (i + 1), mPaintRed);
            } else {
                // 根据屏幕的大小来选择摆放的位置
                canvas.drawText(str[i], width - mTextPaint.measureText("m"), height / 26 * (i + 1), mTextPaint);
            }
        }
    }
}

主程序

package com.test.mypathview;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
    private TextView mTextView;
    //得到自己定义的View
    private MySlider mMySlider;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView=(TextView) findViewById(R.id.textview);
        mMySlider=(MySlider) findViewById(R.id.slider);
        //因为在自己定义的View中创建了接口,所以此处可以直接使用接口,然后实现接口中的方法来进行值的传递
        mMySlider.setOnItemSelectListener(new MySlider.OnItemSelect(){

            @Override
            public void onIntemSelected(int index, String indexString) {
                //然后通过传入的值来改变字体
                mTextView.setText(indexString);

            }

        });
    }

}

布局文件

<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" >

    <com.test.mypathview.MySlider
        android:id="@+id/slider"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/textview"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:text="A"
        android:textSize="100sp" />

</RelativeLayout>

最终效果图

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值