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>
28自定义View 模仿联系人字母侧栏的更多相关文章
- 28 自定义View画坐标和柱状图
自定义View类 RectView.java package com.qf.sxy.day29_customview.widget; import android.content.Context; i ...
- 28 自定义View侧滑栏
ScrollMenuView.java package com.qf.sxy.customview03.widget; import android.content.Context; import a ...
- 28 自定义View流式布局
流式布局每行的行高以本行中最高的元素作为高,如果一个元素放不下到一行时直接到第二行 FlowLayoutView package com.qf.sxy.customview05.widget; imp ...
- Android自定义View——实现字母导航栏
1.自定义View实现字母导航栏 2.ListView实现联系人列表 3.字母导航栏滑动事件处理 4.字母导航栏与中间字母的联动 5.字母导航栏与ListView的联动 1.先看主布局,方便后面代码的 ...
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
我们的手机通讯录一般都有这样的效果,如下图: OK,这种效果大家都见得多了,基本上所有的android手机通讯录都有这样的效果.那我们今天就来看看这个效果该怎么实现. 一.概述 1.页面功能分析 整体 ...
- wing带你玩转自定义view系列(3)模仿微信下拉眼睛
发现了爱神的自定义view系列,我只想说一个字:凸(艹皿艹 ) !!相见恨晚啊,早看到就不会走这么多弯路了 另外相比之下我这完全是小儿科..所以不说了,这篇是本系列完结篇....我要从零开始跟随爱哥脚 ...
- wing带你玩转自定义view系列(2) 简单模仿qq未读消息去除效果
上一篇介绍了贝塞尔曲线的简单应用 仿360内存清理效果 这一篇带来一个 两条贝塞尔曲线的应用 : 仿qq未读消息去除效果. 转载请注明出处:http://blog.csdn.net/wingicho ...
- 【Android - 自定义View】之自定义颜色渐变的Tab导航栏
首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 GradientTab ,继承自View类: (2)这个自定义View实现了颜色渐变的Tab导航栏(仿微信主菜单),用户在左右滑 ...
- 安卓开发28:自定义View类
自定义View类 通过自定义View类,可以自定义复杂的,按照自己需求的控件. 一个简单的例子 mainActivity.java 这个里面就是最普通的代码,但是给自定义的控件加上了一个onclick ...
随机推荐
- kafka知识体系-kafka设计和原理分析
kafka设计和原理分析 kafka在1.0版本以前,官方主要定义为分布式多分区多副本的消息队列,而1.0后定义为分布式流处理平台,就是说处理传递消息外,kafka还能进行流式计算,类似Strom和S ...
- hihoCoder 1595 : Numbers
Description You are given n constant integers c[1], c[2], ..., c[n] and an integer k. You are to ass ...
- 【BZOJ2186】【SDOI2008】沙拉公主的困惑
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁 ...
- 【BZOJ2241】【Sdoi2011R1D1】打地鼠
原题传送门 Description 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. ...
- 【luogu2161】【SHOI2009】Booking会场预约
原题传送门 题意简析:你需要写一个数据结构,维护一个时间轴,支持如下操作: 1)插入1个新区间,删除所有时间轴上与它有交的区间并输出个数. 2)查询当前时间轴上的区间个数. 解题思路:裸的无旋trea ...
- 【HNOI2016】序列 莫队+单调栈+RMQ
Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,ar-1,ar.若1≤l≤s≤t≤r≤n,则称a ...
- ●BZOJ 3931 [CQOI2015]网络吞吐量
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3931 题解: 在最短路图上跑网络流,要开long long(无奈 BZOJ AC 不了,洛谷 ...
- ●BZOJ 2560 串珠子
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2560 题解: 容斥,状压计数dp 首先求出一个数组 g[s] 表示集合内的点的连边方案数(两 ...
- hdu 5120(2014北京—求圆相交)
题意:求环的相交面积 思路: 通过画图可知,面积= 大圆相交面积 - 大小圆相交面积*2 + 小小圆相交面积 再通过圆相交模板计算即可 #include <iostream> #incl ...
- oracle安装过程和创建本地数据库
环境: win7 64位 工具: PLSQL Developer 百度云下载:链接:https://pan.baidu.com/s/14L3VCG8YwHzpdhEN7ama0w 密码:jlre or ...