Android 竖直的滑竿

最近项目里面要添加一个竖直的滑竿,最初是想重写SeekBar来实现的,虽然最终实现了,但是适应性不好,所以为了适应不同的设备,所以通过SurfaceView来实现绘图方式,下面就是具体的步骤:

首先编一个实现滑竿功能的类,这里我命名为:AppVerticalSeekBar

代码如下:

package com.zhangjie.verseekbar;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class AppVerticalSeekBar extends SurfaceView implements SurfaceHolder.Callback {

	public static AppVerticalSeekBar instance;
	Context context;
	public AppVerticalSeekBar(Context context) {
		super(context);
		instance = this;
		this.context = context;
		init();
	}

	public AppVerticalSeekBar(Context context, AttributeSet attrs){
		super(context, attrs);
		instance = this;
		this.context = context;
		init();
	}
	
	public int dip2px(float dpValue) {  
        return (int)(dpValue * scale + 0.5f);
    }
	
	public int px2dip(float pxValue) {  
        return (int) (pxValue / scale + 0.5f);
    }  
	
	//获取屏幕的宽度,高度和密度以及dp / px
	 public void getDisplayMetrics() {
  		DisplayMetrics dm = new DisplayMetrics();
  		dm = context.getApplicationContext().getResources().getDisplayMetrics();
  		int width = dm.widthPixels;
  		int height = dm.heightPixels;
  		scale = context.getResources().getDisplayMetrics().density;
  		double bb = Math.sqrt(Math.pow(width, 2)+ Math.pow(height, 2));
  		dimension = bb / (160 * dm.density);
	 }	
	 
	public void init(){
		holder = this.getHolder();
		holder.addCallback(this);
		getDisplayMetrics();
		paint = new Paint();
		paint.setAlpha(255);
		paint.setAntiAlias(true);//抗锯齿
		setFocusable(true);
        setFocusableInTouchMode(true);
        setZOrderOnTop(true);
		stickBar_height = dip2px(180);
		stickBall_width = dip2px(40);
		stickBallPointY = stickBar_height - stickBall_width;
		holder.setFormat(PixelFormat.TRANSPARENT);//设置背景透明
		stickBar = BitmapFactory.decodeResource(getResources(), R.drawable.v_bar);
		stickBall =  BitmapFactory.decodeResource(getResources(), R.drawable.v_bar_stick);
		stickBar = Bitmap.createScaledBitmap(stickBar, stickBall_width, stickBar_height, true);
		stickBall = Bitmap.createScaledBitmap(stickBall, stickBall_width, stickBall_width, true);
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		try {
			if (!isHide) {
				y = event.getY();
				if (y < 0) {
					y = 0;
				}
				if (y > stickBar_height - stickBall_width) {
					y = stickBar_height - stickBall_width;
				}
				stickBallPointY = y;
				redraw();
				Thread.sleep(70);
			}else {
				Thread.sleep(200);
			}
			
		} catch (Exception e) {
			
		}
		return true;
	}
	
	public synchronized void redraw() {
		Canvas canvas = null;
		try {
			if (!isHide) {
				canvas = holder.lockCanvas();
				canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);//清除屏幕
				canvas.drawBitmap(stickBar, stickBarPointX, stickBarPointY, paint);
				canvas.drawBitmap(stickBall, stickBallPointX, stickBallPointY, paint);
			}else {
				 canvas = holder.lockCanvas();
	             canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);//清除屏幕
			}
		} catch (Exception e) {
		
		}finally{
			if (canvas != null) {
				holder.unlockCanvasAndPost(canvas);
			}
			
		}
	}
	/*
	 * 设置是否隐藏
	 */
	public void isHide(boolean opt){
		isHide = opt;
		redraw();
	}
	public void surfaceCreated(SurfaceHolder holder) {
		holder.setFormat(PixelFormat.TRANSPARENT);
		redraw();
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		redraw();
	}

	public void surfaceDestroyed(SurfaceHolder holder) {
		
	}

	double dimension = 0.00;
	float scale;
	float y;
	int stickBar_height;
	int stickBall_width;
	Paint paint;
	SurfaceHolder holder;
	Bitmap stickBar = null;
	Bitmap stickBall = null;
	private boolean isHide = false;
	private float stickBallPointX = 0;
	private float stickBallPointY = 100;
	private float stickBarPointX = 0;
	private float stickBarPointY = 0;
}


接下来就是编写调用滑竿的主类:这里命名为main

代码如下:

package com.zhangjie.verseekbar;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RelativeLayout;

public class main extends Activity{

	RelativeLayout Parent;
	AppVerticalSeekBar appVerticalSeekBar;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		scale = getResources().getDisplayMetrics().density;
		Parent = new RelativeLayout(this);
		RelativeLayout.LayoutParams appLayoutParams = new RelativeLayout.LayoutParams(dip2px(40), dip2px(180));
		appLayoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
		appVerticalSeekBar = new AppVerticalSeekBar(this);
		Parent.addView(appVerticalSeekBar, appLayoutParams);
		setContentView(Parent);
	}
	public int dip2px(float dpValue) {  
        return (int)(dpValue * scale + 0.5f);
    }
	
	public int px2dip(float pxValue) {  
        return (int) (pxValue / scale + 0.5f);
    }  
	float scale;
}


最终的实现效果如下:

 

源码地址:

http://download.csdn.net/download/jwzhangjie/5327032

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值