自定义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>

28自定义View 模仿联系人字母侧栏的更多相关文章

  1. 28 自定义View画坐标和柱状图

    自定义View类 RectView.java package com.qf.sxy.day29_customview.widget; import android.content.Context; i ...

  2. 28 自定义View侧滑栏

    ScrollMenuView.java package com.qf.sxy.customview03.widget; import android.content.Context; import a ...

  3. 28 自定义View流式布局

    流式布局每行的行高以本行中最高的元素作为高,如果一个元素放不下到一行时直接到第二行 FlowLayoutView package com.qf.sxy.customview05.widget; imp ...

  4. Android自定义View——实现字母导航栏

    1.自定义View实现字母导航栏 2.ListView实现联系人列表 3.字母导航栏滑动事件处理 4.字母导航栏与中间字母的联动 5.字母导航栏与ListView的联动 1.先看主布局,方便后面代码的 ...

  5. android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索

    我们的手机通讯录一般都有这样的效果,如下图: OK,这种效果大家都见得多了,基本上所有的android手机通讯录都有这样的效果.那我们今天就来看看这个效果该怎么实现. 一.概述 1.页面功能分析 整体 ...

  6. wing带你玩转自定义view系列(3)模仿微信下拉眼睛

    发现了爱神的自定义view系列,我只想说一个字:凸(艹皿艹 ) !!相见恨晚啊,早看到就不会走这么多弯路了 另外相比之下我这完全是小儿科..所以不说了,这篇是本系列完结篇....我要从零开始跟随爱哥脚 ...

  7. wing带你玩转自定义view系列(2) 简单模仿qq未读消息去除效果

    上一篇介绍了贝塞尔曲线的简单应用 仿360内存清理效果 这一篇带来一个  两条贝塞尔曲线的应用 : 仿qq未读消息去除效果. 转载请注明出处:http://blog.csdn.net/wingicho ...

  8. 【Android - 自定义View】之自定义颜色渐变的Tab导航栏

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 GradientTab ,继承自View类: (2)这个自定义View实现了颜色渐变的Tab导航栏(仿微信主菜单),用户在左右滑 ...

  9. 安卓开发28:自定义View类

    自定义View类 通过自定义View类,可以自定义复杂的,按照自己需求的控件. 一个简单的例子 mainActivity.java 这个里面就是最普通的代码,但是给自定义的控件加上了一个onclick ...

随机推荐

  1. [LeetCode] 2 Keys Keyboard 两键的键盘

    Initially on a notepad only one character 'A' is present. You can perform two operations on this not ...

  2. 关于Ueditor存储在mysql"UTF-8"乱码的问题

    关于Ueditor存储在mysql"UTF-8"乱码的问题 首先小编要声明之前出乱码的原因,mysql 字段设置的BLOB类型 紧接着我们要先确认两件事: 1.首先要确认你的mys ...

  3. Centos常用命令之:文件与目录管理

    在centos中常用的文件与目录操作命令有: ◇chmod:修改文件或目录的权限 ◇mkdir:新建目录◇rmdir:删除目录◇rm:删除目录或文件◇cp:复制目录或文件◇mv:移动目录或文件 下面就 ...

  4. Lazy Loading | Explicit Loading | Eager Loading in EntityFramework and EntityFramework.Core

    EntityFramework Eagerly Loading Eager loading is the process whereby a query for one type of entity ...

  5. [SDOI 2017]数字表格

    Description 题库链接 记 \(f_i\) 为 \(fibonacci\) 数列的第 \(i\) 项. 求 \[\prod_{i=1}^n\prod_{j=1}^mf_{gcd(i,j)}\ ...

  6. [Codeforces]856E - Satellites

    传送门 做法:每个卫星分别用连到左边圆与x轴交点的线的斜率和连到右边交点的线旋转90度的斜率可以表示成一个区间,问题转化成支持加/删区间和询问其中两个区间是否有交以及它们的交是否被其他区间包含.我一开 ...

  7. ●Joyoi 收集邮票

    题链: http://www.joyoi.cn/problem/tyvj-2325题解.1: 期望dp,(平方的期望不等于期望的平方...) 在这个题上坑了好久,也算是对期望的理解又深了一些. 很好的 ...

  8. ●BZOJ 3126 [Usaco2013 Open]Photo

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3126 题解: 单调队列优化DP,神奇.. (好像某次考试考过,当时我用了差分约束+SPFA优 ...

  9. 【Codeforces Round #430 (Div. 2) A C D三个题】

    ·不论难度,A,C,D自己都有收获! [A. Kirill And The Game] ·全是英文题,述大意:    给出两组区间端点:l,r,x,y和一个k.(都是正整数,保证区间不为空),询问是否 ...

  10. bzoj1132[POI2008]Tro 计算几何

    1132: [POI2008]Tro Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1722  Solved: 575[Submit][Status] ...