安卓虚拟摇杆
作者微博: @安卓攻城师sloop
由于需要制作一个控制小车移动的应用,使用按键控制不太舒服,故制作了一个虚拟摇杆。
该摇杆原理十分简单,就是继承一个surfaceView,然后根据用户操作不断重绘界面,同时返回给用户当前角度。 如果用户不指定摇杆背景和摇杆,则默认绘制两个圆形,效果如下图所示。
摇杆的图片和背景图片可以随意指定,并且在运行过程中也可以更换(ps:图片内容需要为圆形且背景透明),指定图片后效果如下:
<com.sloop.widget.Rocker
android:id="@+id/rudder"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Rocker rocker = (Rocker) findViewById(R.id.rudder);
Bitmap rocker_bg = BitmapFactory.decodeResource(getResources(), R.drawable.rocker_bg1);
Bitmap rocker_ctrl = BitmapFactory.decodeResource(getResources(), R.drawable.rocker_ctrl);
rocker.setRockerBg(rocker_bg);
rocker.setRockerCtrl(rocker_ctrl);
rocker.setRudderListener(new Rocker.RudderListener() {
@Override
public void onSteeringWheelChanged(int action, int angle) {
if (action == Rocker.ACTION_RUDDER) {
//TODO:事件实现
Log.e("夹角", "angle"+angle);
}
}
});
/** 设置摇杆背景图 */
public void setRockerBg(Bitmap bitmap) {
rocker_bg = Bitmap.createScaledBitmap(bitmap, mWheelRadius * 2, mWheelRadius * 2, true);
}
/** 设置摇杆图片 */
public void setRockerCtrl(Bitmap bitmap) {
rocker_ctrl = Bitmap.createScaledBitmap(bitmap, mRudderRadius * 2, mRudderRadius * 2, true);
}
/** 设置摇杆活动半径 */
public void setmWheelRadius(int radius) {
mWheelRadius = DensityUtil.dip2px((ContextThemeWrapper) context, radius);
}
/** 设置摇杆半径 */
public void setmRudderRadius(int radius) {
mRudderRadius = DensityUtil.dip2px((ContextThemeWrapper) context, radius);
}