我是要做一台車子當方向鍵,但發現button無法同時案複數以上的,所以改以遊戲搖桿的方式製作
第一種:先製造一個背景為透明的圓形圖片,並將圖片放入 drawable
package com.example.testr;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
public class Move {
public static MainActivity main;
private float x1,y1;
private float x2,y2;
private final float r1,r2;
public float angle;
public boolean down=false;
public boolean in=false;
public boolean move=false;
public Bitmap img;
public static RectF rectf=new RectF();
public Move(){
r1 = 480 * 0.5f * transfer.bili;//這個是外圈的半徑大小計算
r2 = 300 * 0.5f * transfer.bili;//這個是內圈的半徑大小計算
img= BitmapFactory.decodeResource(main.getResources(),R.drawable.test);
//BitmapFactory.decodeResource(加載圖的資源文件的對象,加載圖的Id)
//BitmapFactory.decodeResource(同上,同上,加載的位圖是否需要完整顯示)
//放入已經製作好的搖桿圖
}
public void down(float bigx,float bigy){ //摇杆按下后的操作
if(bigx<r1) x1=r1;
else x1 = bigx;
if(transfer.h-bigy<r1) y1=transfer.h-r1;
else y1 = bigy;
//這裡是預防案的太接近預設的邊界,
down=true;
}
//按下摇杆后移动的操作
public void move(float xx,float yy){
//傳值到自製的 class 計算角度
angle=getAngle(xx,yy);
//傳值到自製的 class 偵測小圓是否超出大圓的大小
in=in(xx, yy);
//傳值到自製的 class 移動時的操作
move=isMove(xx,yy);
if (!in) {
xx= (float) (x1+ Math.sin(angle)*r1*0.7f);
yy= (float) (y1+ Math.cos(angle)*r1*0.7f);
}
x2=xx;
y2=yy;
}
//手指放開後的控制
public void up(){
down=false;
}
public float getAngle(float xx,float yy){ //获取x1y1指向x2y2的角度
double angle,k;
if (y1==yy)//斜率不存在的時候
if (x1 > xx)//判断x1指向x2的方向
angle=-Math.PI/2;
else
angle=Math.PI/2;
else{
k=(x1-xx)/(y1-yy);
if (y1 > yy) {//判断大圓指向小圓的方向
angle=Math.atan(k) + Math.PI;
} else {
angle=Math.atan(k);
}
if(angle>Math.PI)
angle-=Math.PI*2;
else if(angle<-Math.PI)
angle+=Math.PI*2;
}
return (float) angle;
}
public boolean in(float xx, float yy) {
//計算按的位置減去原本的中心位置得出離中心有多遠
double r = Math.sqrt((x1 - xx) * (x1 - xx) + (y1 - yy) * (y1 - yy));
//上面計算的值不超過大圓半徑的70%
if (r < r1*0.7f)
return true;
else return false;
}
//判斷按下搖桿後 是否移動,如果距離大於r1*0.15視為移動
public boolean isMove(float xx, float yy) {
// MY实际开发中用到,该教程用不到此变量
double r = Math.sqrt((x1 - xx) * (x1 - xx) + (y1 - yy) * (y1 - yy));
if (r > r1*0.15f)
return true;
else return false;
}
public void onDraw(Canvas g, Paint p){
if(down) {
//大圓的邊界設定
rectf.left = x1 - r1;
rectf.top = y1 - r1;
rectf.right = x1 + r1;
rectf.bottom = y1 + r1;
g.drawBitmap(img, null, rectf, p);
//小圓的邊界設定
rectf.left = x2 - r2;
rectf.top = y2 - r2;
rectf.right = x2 + r2;
rectf.bottom = y2 + r2;
g.drawBitmap(img, null, rectf, p);
//g.drawBitmap(圖片bitmap, 繪製圖片的哪一部分, 圖片繪畫的位置, 畫筆Paint);
}
}
}