http://blog.csdn.net/snowleopard_wu/article/details/7818633
看见有些应用实现了一个右边竖着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>