android之滑动选择切换字符

看见有些应用实现了一个右边竖着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>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值