看见有些应用实现了一个右边竖着26个字母,手指在字母区域滑动可以让屏幕中间的字符不断的切换的效果,所以最近也跟着实现了一个,但效果比较一般,不能再320*480的屏幕上真确显示,希望贴出来后有读者能一起交流改进这个dmeo,在该demo在字符外点击屏幕后滑动在字符区域屏幕是无效果的,因为字符区域就是一个view层,只有在该view层事件才能触发对应的事件,详细看代码。在此先上张图:
工具处理类:
package cn.hanspk;
import android.content.Context;
/**因为密度问题的单位转换*/
public class dip_px_Util {
/**
* dip转换成px
* @param context
* @param dipValue
* @return
*/
public static int dip2px(Context context, float dipValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dipValue * scale + 0.5f);
}
/**
* px转换成dip
* @param context
* @param pxValue
* @return
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
demo入口类 MainAcitivity
package cn.hanspk;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
public class MainActivity extends Activity {
private static MainActivity mIntance = null;
public static final int show_char = 0; // 显示字符
public static final int dimiss_char = 1; //隐藏字符
private TextView char_value = null;
private TestView tv_myview = null;
/**
* 控制字符的显示和隐藏
*/
public Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch(msg.what){
case show_char:
char_value.setVisibility(View.VISIBLE);
char_value.setText(tv_myview.getChar());
break;
case dimiss_char:
char_value.setVisibility(View.GONE);
break;
}
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* 设置无标题和全屏
*/
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
mIntance = this;
setContentView(R.layout.main);
char_value = (TextView)findViewById(R.id.text_value_id);
char_value.setVisibility(View.GONE);
tv_myview = (TestView)findViewById(R.id.textId);
}
public static MainActivity getIntance() {
return mIntance;
}
}
字符处理类:
package cn.hanspk;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class TestView extends View {
private Context context = null;
private String[] CharSet = { "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 = null;
private int charhpx; //一个字符 的高度
private int AllH; //26个字符的总高度
private int charpx; //显示字符的最大宽度
public TestView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public TestView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public TestView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
this.context = context;
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setTextSize(25);
/**
* 找到字符中宽度最宽的字符
*/
int temp = 0;
for (int j = 0; j < CharSet.length - 1; j++) {
if (((int) paint.measureText(CharSet[j])) < ((int) paint
.measureText(CharSet[j + 1]))) {
temp = (int) paint.measureText(CharSet[j + 1]);
} else {
temp = (int) paint.measureText(CharSet[j]);
}
}
/**
* 最大宽度加上2
*/
charpx = dip_px_Util.dip2px(context, temp)
+ dip_px_Util.dip2px(context, 2);
System.out.println("-----" + dip_px_Util.dip2px(context, temp));
/**
* 获得单个字符的高度
*/
FontMetrics fm = paint.getFontMetrics();
charhpx = (int) fm.top;
System.out.println("-----》"+charhpx);
System.out.println("-----" + dip_px_Util.px2dip(context, -charhpx));
System.out.println("-----" + dip_px_Util.dip2px(context, 5));
//取得所有字符的的高度
AllH = charhpx * CharSet.length;
System.out.println("-----" + dip_px_Util.px2dip(context, AllH));
// this.onMeasure(0, 0);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
for (int i = 0; i != CharSet.length; i++) {
canvas.drawText(CharSet[i], dip_px_Util.px2dip(context, 2),
dip_px_Util.px2dip(context, -charhpx)
* ((i + 1) * (float) 1.5), paint);
}
}
/**
* 设置改view的大小
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
setMeasuredDimension(charpx, (-charhpx) * CharSet.length);
}
private boolean isShowChar = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
int y = (int) event.getY();
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// System.out.println("====>" + y);
if (y < ((-charhpx) * CharSet.length)) {
int id = y / (-charhpx);
// System.out.println("----====>" + CharSet[id]);
setChar(CharSet[id]);
isShowChar = true;
RefreshCharVaule();
}
break;
case MotionEvent.ACTION_MOVE:
y = (int) event.getY();
System.out.println("====>" + y);
if ((0<y)&&y < ((-charhpx) * CharSet.length)) {
int id = y / (-charhpx);
// System.out.println("----====>" + CharSet[id]);
setChar(CharSet[id]);
RefreshCharVaule();
}
break;
case MotionEvent.ACTION_UP:
isShowChar = false;
RefreshCharVaule();
break;
}
return true;
}
private String char_value;
private void setChar(String char_value) {
this.char_value = char_value;
}
public String getChar() {
return this.char_value;
}
/**
* 更新显示的字符
*/
private void RefreshCharVaule(){
if (isShowChar) {
// canvas.drawText(text, , y, paint);
MainActivity.getIntance().handler.sendEmptyMessage(MainActivity.getIntance().show_char);
}else if(!isShowChar){
MainActivity.getIntance().handler.sendEmptyMessage(MainActivity.getIntance().dimiss_char);
}
}
}
demo的xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<cn.hanspk.TestView
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="15dp"
android:id="@+id/textId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView android:text="A"
android:layout_height="wrap_content"
android:textSize="40sp"
android:id="@+id/text_value_id"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"/>
</RelativeLayout>