android之滑动选择切换字符

来源:互联网 发布:7z linux解压命令 编辑:程序博客网 时间:2024/05/22 04:27

看见有些应用实现了一个右边竖着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(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubswitch(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. */@Overridepublic 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 stubthis.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);}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.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的大小 */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubsetMeasuredDimension(charpx, (-charhpx) * CharSet.length);}private boolean isShowChar = false;@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubint 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>


 

原创粉丝点击