這個只能做來玩玩兒,沒有太多的使用價值,看著好玩,有密集恐懼癥的就不要玩兒了
在實現(xiàn)上主要使用了兩個自定義view
,
一個畫圓(使用圖片也是可以的)
一個寫位置邏輯
github鏈接
上圖
其中有兩種狀態(tài)诅挑,一種可以重疊,一種不能重疊泛源。類似Window 7 氣泡的屏保拔妥。
一個使用兩個自定義view,一個就是一個圓圈,一個實現(xiàn)動畫达箍,邊界計算
圓圈的view
計算距離的view
在實現(xiàn)上畫圓的view
簡單到其實就一個方法
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setStyle(painStyle);
mPaint.setColor(color);
mPaint.setStrokeWidth(width);
canvas.drawCircle(mWidth/2,mHeight/2,mWidth/2-width*2,mPaint);
}
就是一個圓圈没龙,這里其實使用圖片簡單粗暴,啥也不用寫,只是為了獲取一個圓而已
下一個view
多一點邏輯
如下:
/**
* add view 獲取到view
* @param view
*/
public void addBallsView(RainBallView view){
Balls balls=new Balls();
balls.setRainBallView(view);
balls.setXtag(movePos);
balls.setYtag(movePos);
// balls.getRainBallView().setX(200/((int)(Math.random()*9)+1));
// balls.getRainBallView().setY(200/((int)(Math.random()*9)+1));
mViewList.add(balls);
addView(view);
}
當然了有對象最好兜畸。有一個Ball的對象實現(xiàn)
邏輯代碼如下
public void startMove(){
for (int i = 0; i < mViewList.size(); i++) {
//保證每一個小球的唯一性努释,使用對象
Balls rainBallView= mViewList.get(i);
//寬度判斷
// Log.i("x-->",rainBallView.getRainBallView().getX()+"");
// Log.i("y-->",rainBallView.getRainBallView().getY()+"");
// Log.i("w-->",screenWidth-rainBallView.getRainBallView().getWidth()+"");
if(rainBallView.getRainBallView().getX()<0||rainBallView.getRainBallView().getX()>=screenWidth-rainBallView.getRainBallView().getWidth()){
rainBallView.setXtag(-rainBallView.getXtag());
//隨機數(shù)出現(xiàn)不能一次將值的正負改變碘梢,所以取最大值,否則會在邊界上抖
//×2為了避免是在邊界碰撞咬摇,位置移動沒辦法移出來
randomX=rainBallView.getXtag()*2;
}else {
randomX=(int)(Math.random()*rainBallView.getXtag());
}
//高度判斷
if(rainBallView.getRainBallView().getY()<0||rainBallView.getRainBallView().getY()>=screenHeight-rainBallView.getRainBallView().getHeight()){
rainBallView.setYtag(-rainBallView.getYtag());
//隨機數(shù)出現(xiàn)不能一次將值的正負改變,所以取最大值
//×2為了避免是在邊界碰撞煞躬,位置移動沒辦法移出來
randomY=rainBallView.getYtag()*2;
}else {
randomY=(int)(Math.random()*rainBallView.getYtag());
}
//判斷兩個小球之間的距離肛鹏,如果相聚小于兩個的半徑值的兩倍,則接觸了恩沛,就反彈
for (int j = 0; j < mViewList.size(); j++) {
//排除自己
if(j!=i&&isReward){
//x方向的距離的絕對值
int xTox=(int) Math.abs(rainBallView.getRainBallView().getX()-mViewList.get(j).getRainBallView().getX());
//y方向的距離的絕對值
int yToy= (int) Math.abs(rainBallView.getRainBallView().getY()-mViewList.get(j).getRainBallView().getY());
//兩個球的距離
int ballToball=rainBallView.getRainBallView().getWidth();
// Log.i("xDis",xTox+"-"+ballToball+"-"+yToy);
//x和y方向的距離的絕對值
if(xTox<ballToball&&yToy<ballToball){
//當前的小球x方向取反
rainBallView.setXtag(-rainBallView.getXtag());
//隨機數(shù)出現(xiàn)不能一次將值的正負改變在扰,所以取最大值
//×2兩個小球一起移動,位移是兩倍
if(rainBallView.getXtag()>0){
randomX=(ballToball-xTox);
}else {
randomX=-(ballToball-xTox);
}
randomX= rainBallView.getXtag()*2;
//當前的小球y方向取反
rainBallView.setYtag(-rainBallView.getYtag());
//隨機數(shù)出現(xiàn)不能一次將值的正負改變雷客,所以取最大值
//×2為了避免是在邊界碰撞芒珠,位置移動沒辦法移出來
if(rainBallView.getYtag()>0){
randomY=(ballToball-yToy);
}else {
randomY=-(ballToball-yToy);
}
//×2兩個小球一起移動,位移是兩倍
randomY=rainBallView.getYtag()*2;
mViewList.get(j).setXtag(-mViewList.get(j).getXtag());
mViewList.get(j).setYtag(-mViewList.get(j).getYtag());
}
}
}
rainBallView.getRainBallView().setX(rainBallView.getRainBallView().getX()+randomX);
rainBallView.getRainBallView().setY(rainBallView.getRainBallView().getY()+randomY);
}
}
注釋盡量寫的多一點搅裙,修改過部分皱卓,有一兩注釋句可能位置不對,沒啥大的影響
對于多次的繪制view部逮,使用了handler
實現(xiàn)的延遲操作娜汁,實現(xiàn)運動的效果
private Handler mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==1){
mHandler.sendEmptyMessageDelayed(1,5);
startMove();
}
}
};
這也是比肩常用的方式。很多時候延遲都會用到handler
實現(xiàn)兄朋。
使用,考入兩個自定義view,直接使用
只要是計算邊界的位置掐禁,保證小球不能出界,出界就讓它往回走颅和,分別判斷了寬高的位置
if(rainBallView.getRainBallView().getX()<0||rainBallView.getRainBallView().getX()>=screenWidth-rainBallView.getRainBallView().getWidth()){
rainBallView.setXtag(-rainBallView.getXtag());
//隨機數(shù)出現(xiàn)不能一次將值的正負改變傅事,所以取最大值,否則會在邊界上抖
//×2為了避免是在邊界碰撞,位置移動沒辦法移出來
randomX=rainBallView.getXtag()*2;
}else {
randomX=(int)(Math.random()*rainBallView.getXtag());
}
//高度判斷
if(rainBallView.getRainBallView().getY()<0||rainBallView.getRainBallView().getY()>=screenHeight-rainBallView.getRainBallView().getHeight()){
rainBallView.setYtag(-rainBallView.getYtag());
//隨機數(shù)出現(xiàn)不能一次將值的正負改變峡扩,所以取最大值
//×2為了避免是在邊界碰撞享完,位置移動沒辦法移出來
randomY=rainBallView.getYtag()*2;
}else {
randomY=(int)(Math.random()*rainBallView.getYtag());
}
還有就是判斷當前繪制的小球不能和其他的小球的距離小于兩個小球的半徑和,也就是直徑的距離有额,由x和y兩個方向般又,分別判斷,實現(xiàn)位置的判斷
//x方向的距離的絕對值
int xTox=(int) Math.abs(rainBallView.getRainBallView().getX()-mViewList.get(j).getRainBallView().getX());
//y方向的距離的絕對值
int yToy= (int) Math.abs(rainBallView.getRainBallView().getY()-mViewList.get(j).getRainBallView().getY());
//兩個球的距離
int ballToball=rainBallView.getRainBallView().getWidth();
// Log.i("xDis",xTox+"-"+ballToball+"-"+yToy);
//x和y方向的距離的絕對值
if(xTox<ballToball&&yToy<ballToball){
// .......
}
實現(xiàn)了判斷巍佑,只剩下位置的后移茴迁。和方向的反轉(zhuǎn),這樣就是反彈效果萤衰,
其余的樣式參數(shù)也就只是簡單的設(shè)置一下就可以了
使用鏈接
xml布局中
<com.yk.myselfview.views.RainBallLayout android:layout_width="match_parent"
android:id="@+id/rain_ball_layout"
android:layout_height="match_parent">
</com.yk.myselfview.views.RainBallLayout>
頁面
public class BallsViewActivity extends AppCompatActivity {
private RainBallLayout mRainBallLayout;
private List<Integer> mListColor=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_balls_view);
mListColor.add(Color.BLUE);
mListColor.add(Color.BLACK);
mListColor.add(Color.GREEN);
mListColor.add(Color.RED);
mListColor.add(Color.CYAN);
mRainBallLayout = (RainBallLayout) findViewById(R.id.rain_ball_layout);
for (int i = 0; i < 1; i++) {
RainBallView rainBallView=getRainBallView();
mRainBallLayout.addBallsView(rainBallView);
//s是否可以相交
mRainBallLayout.isReward(true);
mRainBallLayout.startAmimation();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mRainBallLayout.stopAmimation();
}
public void addBall(View view) {
RainBallView rainBallView = getRainBallView();
mRainBallLayout.addBallsView(rainBallView);
}
@NonNull
private RainBallView getRainBallView() {
Random random=new Random();
int color = random.nextInt(4);
RainBallView rainBallView=new RainBallView(this);
rainBallView.setColors(mListColor.get(color));
rainBallView.setPainStyle(Paint.Style.STROKE);
rainBallView.setWidth(4);
return rainBallView;
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者