首先附上效果图
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 {
-
-
- private float mRockerBg_X;
- private float mRockerBg_Y;
- private float mRockerBg_R;
-
- 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);
-
-
- mBmpRockerBg = BitmapFactory.decodeResource(context.getResources(), R.drawable.rocker_bg);
- mBmpRockerBtn = BitmapFactory.decodeResource(context.getResources(), R.drawable.rocker_btn);
-
- getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
-
-
- @Override
- public boolean onPreDraw() {
-
- getViewTreeObserver().removeOnPreDrawListener(this);
-
- Log.e("RockerView", getWidth() + "/" + getHeight());
- mCenterPoint = new PointF(getWidth() / 2, getHeight() / 2);
- mRockerBg_X = mCenterPoint.x;
- mRockerBg_Y = mCenterPoint.y;
-
- mRockerBtn_X = mCenterPoint.x;
- mRockerBtn_Y = mCenterPoint.y;
-
- float tmp_f = mBmpRockerBg.getWidth() / (float)(mBmpRockerBg.getWidth() + mBmpRockerBtn.getWidth());
- mRockerBg_R = tmp_f * getWidth() / 2;
- mRockerBtn_R = (1.0f - tmp_f)* getWidth() / 2;
-
- return true;
- }
- });
-
-
- new Thread(new Runnable() {
-
- @Override
- public void run() {
-
- while(true){
-
-
- RockerView.this.postInvalidate();
-
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
-
- e.printStackTrace();
- }
- }
- }
- }).start();
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
-
- super.onDraw(canvas);
- canvas.drawBitmap(mBmpRockerBg, null,
- new Rect((int)(mRockerBg_X - mRockerBg_R),
- (int)(mRockerBg_Y - mRockerBg_R),
- (int)(mRockerBg_X + mRockerBg_R),
- (int)(mRockerBg_Y + mRockerBg_R)),
- null);
- canvas.drawBitmap(mBmpRockerBtn, null,
- new Rect((int)(mRockerBtn_X - mRockerBtn_R),
- (int)(mRockerBtn_Y - mRockerBtn_R),
- (int)(mRockerBtn_X + mRockerBtn_R),
- (int)(mRockerBtn_Y + mRockerBtn_R)),
- null);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
-
- if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
-
- if (Math.sqrt(Math.pow((mRockerBg_X - (int) event.getX()), 2) + Math.pow((mRockerBg_Y - (int) event.getY()), 2)) >= mRockerBg_R) {
-
- double tempRad = getRad(mRockerBg_X, mRockerBg_Y, event.getX(), event.getY());
-
- getXY(mRockerBg_X, mRockerBg_Y, mRockerBg_R, tempRad);
- } else {
- mRockerBtn_X = (int) event.getX();
- mRockerBtn_Y = (int) event.getY();
- }
- if(mRockerChangeListener != null) {
- mRockerChangeListener.report(mRockerBtn_X - mCenterPoint.x, mRockerBtn_Y - mCenterPoint.y);
- }
- } else if (event.getAction() == MotionEvent.ACTION_UP) {
-
- mRockerBtn_X = mCenterPoint.x;
- mRockerBtn_Y = mCenterPoint.y;
- if(mRockerChangeListener != null) {
- mRockerChangeListener.report(0, 0);
- }
- }
- return true;
- }
-
-
-
-
- public double getRad(float px1, float py1, float px2, float py2) {
-
- float x = px2 - px1;
-
- float y = py1 - py2;
-
- float xie = (float) Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
-
- float cosAngle = x / xie;
-
- float rad = (float) Math.acos(cosAngle);
-
- if (py2 < py1) {
- rad &#61; -rad;
- }
- return rad;
- }
-
-
-
-
-
-
-
-
- public void getXY(float centerX, float centerY, float R, double rad) {
-
- mRockerBtn_X &#61; (float) (R * Math.cos(rad)) &#43; centerX;
-
- mRockerBtn_Y &#61; (float) (R * Math.sin(rad)) &#43; centerY;
- }
-
- RockerChangeListener mRockerChangeListener &#61; null;
- public void setRockerChangeListener(RockerChangeListener rockerChangeListener) {
- mRockerChangeListener &#61; rockerChangeListener;
- }
- public interface RockerChangeListener {
- public void report(float x, float y);
- }
- }
2、布局文件中添加RockerView
- <RelativeLayout xmlns:android&#61;"http://schemas.android.com/apk/res/android"
- xmlns:tools&#61;"http://schemas.android.com/tools"
- android:layout_width&#61;"match_parent"
- android:layout_height&#61;"match_parent"
- android:background&#61;"#ff4f4f4f"
- tools:context&#61;".MainActivity" >
-
- <com.example.rocker.RockerView
- android:id&#61;"&#64;&#43;id/rockerView1"
- android:layout_width&#61;"120dp"
- android:layout_height&#61;"120dp"
- android:layout_alignParentBottom&#61;"true"
- android:layout_marginLeft&#61;"20dp"
- android:layout_marginBottom&#61;"20dp"/>
-
- <com.example.rocker.RockerView
- android:id&#61;"&#64;&#43;id/rockerView2"
- android:layout_width&#61;"120dp"
- android:layout_height&#61;"120dp"
- android:layout_alignParentBottom&#61;"true"
- android:layout_alignParentRight&#61;"true"
- android:layout_marginRight&#61;"20dp"
- android:layout_marginBottom&#61;"20dp"/>
-
- RelativeLayout>
3、MainActiviy中使用RockerView
- package com.example.rocker;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.DisplayMetrics;
- import android.util.Log;
- import android.view.View;
- import android.view.ViewGroup.MarginLayoutParams;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.RelativeLayout;
-
- public class MainActivity extends Activity {
-
- private static final String TAG &#61; "MainActivity";
-
- void doLog(String log) {
- Log.e(TAG, log);
- }
-
- private RockerView rockerView1;
- private RockerView rockerView2;
- int screenWidth;
- int screenHeight;
-
- &#64;Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFlags(
- WindowManager.LayoutParams.FLAG_FULLSCREEN
- | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
- WindowManager.LayoutParams.FLAG_FULLSCREEN
- | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-
-
- setContentView(R.layout.activity_main);
-
- DisplayMetrics dm &#61; getResources().getDisplayMetrics();
- screenWidth &#61; dm.widthPixels;
- screenHeight &#61; dm.heightPixels;
-
- rockerView1 &#61; (RockerView) findViewById(R.id.rockerView1);
- rockerView2 &#61; (RockerView) findViewById(R.id.rockerView2);
-
- rockerView1.setRockerChangeListener(new RockerView.RockerChangeListener() {
-
- &#64;Override
- public void report(float x, float y) {
-
-
- setLayout(rockerView2, (int)x, (int)y);
- }
- });
-
- rockerView2.setRockerChangeListener(new RockerView.RockerChangeListener() {
-
- &#64;Override
- public void report(float x, float y) {
-
-
- setLayout(rockerView1, (int)x, (int)y);
- }
- });
- }
-
- public void setLayout(View v, int dx, int dy) {
- int left &#61; v.getLeft() &#43; dx;
- int top &#61; v.getTop() &#43; dy;
- int right &#61; v.getRight() &#43; dx;
- int bottom &#61; v.getBottom() &#43; dy;
- if (left < 0) {
- left &#61; 0;
- right &#61; left &#43; v.getWidth();
- }
- if (right > screenWidth) {
- right &#61; screenWidth;
- left &#61; right - v.getWidth();
- }
- if (top < 0) {
- top &#61; 0;
- bottom &#61; top &#43; v.getHeight();
- }
- if (bottom > screenHeight) {
- bottom &#61; screenHeight;
- top &#61; bottom - v.getHeight();
- }
- v.layout(left, top, right, bottom);
- }
- }
如下是代码下载地址
http://download.csdn.net/detail/qwjun/9282127