首先附上效果图
1、自定义RockerView
package com.example.rocker;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PointF;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
public class RockerView extends View {
//固定摇杆背景圆形的X,Y坐标以及半径
private float mRockerBg_X;
private float mRockerBg_Y;
private float mRockerBg_R;
//摇杆的X,Y坐标以及摇杆的半径
private float mRockerBtn_X;
private float mRockerBtn_Y;
private float mRockerBtn_R;
private Bitmap mBmpRockerBg;
private Bitmap mBmpRockerBtn;
private PointF mCenterPoint;
public RockerView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
// 获取bitmap
mBmpRockerBg = BitmapFactory.decodeResource(context.getResources(), R.drawable.rocker_bg);
mBmpRockerBtn = BitmapFactory.decodeResource(context.getResources(), R.drawable.rocker_btn);
getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
// 调用该方法时可以获取view实际的宽getWidth()和高getHeight()
@Override
public boolean onPreDraw() {
// TODO Auto-generated method stub
getViewTreeObserver().removeOnPreDrawListener(this);
Log.e("RockerView", getWidth() + "/" + getHeight());
mCenterPoint = new PointF(getWidth() / 2, getHeight() / 2);
mRockerBg_X = mCenterPoint.x;
mRockerBg_Y = mCente