最近项目里面要添加一个竖直的滑竿,最初是想重写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;
}
最终的实现效果如下:
源码地址: