简单七巧板源码
自己以前写过一个简单的七巧板,功能不完善,玩玩可以,不要太认真,分享下。
主程序入口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* * @description: * main qiqiao activity * @author: warren * @email: warrenqin@hotmail.com * @date: 2012.1.10 */ package com.my.Qiqiao; import com.my.game.GameView; import android.app.Activity; import android.os.Bundle; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; public class Qiqiao extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 设置Activity要显示的布局为(R.layout.main) */ //setContentView(R.layout.main); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); layout.addView(new GameView(this), new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); setContentView(layout, layoutParams); } }
整个代码结构可以分为三部分:控制显示的,控制逻辑的,控制数据的 ,真惭愧具体细节都记不太清楚了。
GameView.java 是整个显示的入口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @description: 3 * This file get the action and draw the physics. while one click the panel , 4 * change the selected physic angle;while scroll ,the physic follow your finger. 5 * 6 * @author: warren 7 * @email: warrenqin@hotmail.com 8 * @date: 2012.1.10 9 */ 10 package com.my.game; 11 12 import android.content.Context; 13 import android.graphics.Canvas; 14 import android.graphics.Color; 15 import android.graphics.Paint; 16 import android.util.Log; 17 import android.view.GestureDetector; 18 import android.view.GestureDetector.OnDoubleTapListener; 19 import android.view.GestureDetector.OnGestureListener; 20 import android.view.MotionEvent; 21 import android.view.View; 22 23 public class GameView extends View implements OnDoubleTapListener, OnGestureListener { 24 private DrawPhysics drawPhysics; 25 private LogicPhysics logicphysic; 26 Paint paint; 27 private GestureDetector gestureScanner; 28 String Tag="GameView"; 29 public GameView(Context context) { 30 super(context); 31 // TODO Auto-generated constructor stub 32 drawPhysics=new DrawPhysics(); 33 logicphysic=new LogicPhysics(); 34 paint = new Paint(); 35 gestureScanner=new GestureDetector(this); 36 gestureScanner.setOnDoubleTapListener(this); 37 38 setBackgroundColor(Color.WHITE); 39 paint.setColor(Color.GREEN); 40 } 41 42 @Override 43 protected void onDraw(Canvas canvas) { 44 45 drawPhysics.drawPhysics(canvas, paint); 46 super.onDraw(canvas); 47 48 } 49 @Override 50 public boolean onTouchEvent(MotionEvent event) { 51 //postInvalidate(); 52 gestureScanner.onTouchEvent(event); 53 invalidate(); 54 return true; 55 } 56 57 public boolean onDoubleTap(MotionEvent e) { 58 // TODO Auto-generated method stub 59 Log.d(Tag, "onDoubleTap"); 60 return false; 61 } 62 63 public boolean onDoubleTapEvent(MotionEvent e) { 64 // TODO Auto-generated method stub 65 Log.d(Tag, "onDoubleTapEvent"); 66 return false; 67 } 68 69 public boolean onSingleTapConfirmed(MotionEvent e) { 70 // TODO Auto-generated method stub 71 Log.d(Tag, "onSingleTapConfirmed"); 72 73 logicphysic.cancelSelect(); 74 return false; 75 } 76 77 public boolean onDown(MotionEvent e) { 78 // TODO Auto-generated method stub 79 float x=e.getX(); 80 float y=e.getY(); 81 int i; 82 Log.d(Tag, "onDown"); 83 84 i=logicphysic.checkSelected(x,y); 85 if(i<7){ 86 logicphysic.setSelect(i); 87 Log.d(Tag,"get one physic"); 88 }else{ 89 logicphysic.cancelSelect(); 90 Log.d(Tag,"get null physic"); 91 } 92 return false; 93 } 94 95 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 96 float velocityY) { 97 // TODO Auto-generated method stub 98 logicphysic.cancelSelect(); 99 Log.d(Tag, "onFling"); 100 return false; 101 } 102 103 public void onLongPress(MotionEvent e) { 104 // TODO Auto-generated method stub 105 logicphysic.longPressEvent(e.getX(), e.getY()); 106 Log.d(Tag, "onLongPress"); 107 } 108 109 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 110 float distanceY) { 111 // TODO Auto-generated method stub 112 logicphysic.scrollEvent(e2.getX(), e2.getY()); 113 Log.d(Tag, "onScroll"); 114 return false; 115 } 116 117 public void onShowPress(MotionEvent e) { 118 // TODO Auto-generated method stub 119 Log.d(Tag, "onShowPress"); 120 121 } 122 123 public boolean onSingleTapUp(MotionEvent e) { 124 // TODO Auto-generated method stub 125 logicphysic.oneClickEvent(e.getX(),e.getY()); 126 Log.d(Tag, "onSingleTapUp"); 127 return false; 128 } 129 130 131 }
PhysicsPara.java定义基本的图形要素,中心点坐标、 相对于基准方向的 角度、图形内切圆半径,有了它们就很容的构造出我们所需要的图形了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @description: 3 * 4 * @author: warren 5 * @email: warrenqin@hotmail.com 6 * @date: 2012.1.10 7 */ 8 package com.my.game; 9 10 public class PhysicsPara { 11 int px; //base x position 12 int py; //base y position 13 int angle; 14 float radius;//inner circle radius 15 16 public PhysicsPara(){ 17 px=0; 18 py=0; 19 angle=0; 20 radius=0; 21 } 22 23 public PhysicsPara(int x,int y,int agle){ 24 px=x; 25 py=y; 26 angle=agle; 27 radius=0; 28 } 29 30 // set inner 31 public void setRadius(float r){ 32 radius=r; 33 } 34 public float getRadius(){ 35 return radius; 36 } 37 38 // 39 public void setX(int x){ 40 px=x; 41 } 42 public int getX(){ 43 return px; 44 } 45 // 46 public void setY(int y){ 47 py=y; 48 } 49 public int getY(){ 50 return py; 51 } 52 53 }
DrawPhysics.java 定义了不同图形的实现,也就是说四边形、三角形、平行四边形长什么样子都是由着个文件决定的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* * @description: * if you want to read the code easily , please refer to the Document * qiqiaodesigned.docx. This file is indicate how to construct the seven physics. * @author: warren * @email: warrenqin@hotmail.com * @date: 2012.1.10 */ package com.my.game; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; import android.util.Log; public class DrawPhysics { private int baseLength; DataPhysics dataPhysic; public DrawPhysics(){ dataPhysic= DataPhysics.instance; baseLength=DataPhysics.baseLength; } //draw big triangle. public void drawTriangleB1(Canvas canvas,Paint paint,PhysicsPara para){ Path patht = new Path(); float basex,basey; double x,y; //double diameter=2*baseLength; double edgeLength=2*baseLength; basex=para.px; basey=para.py; double angle; double ao=edgeLength*Math.sqrt(2)/(2*Math.cos(22.5*Math.PI/180)); double oc=edgeLength*(Math.sqrt(2)-1); // first point angle=67.5-para.angle; x=basex-ao*Math.cos(angle*Math.PI/180); y=basey-ao*Math.sin(angle*Math.PI/180); patht.moveTo((float)x,(float)y); // second point angle=22.5-para.angle; x=basex+ao*Math.cos(angle*Math.PI/180); y=basey+ao*Math.sin(angle*Math.PI/180); patht.lineTo((float)x,(float)y); //third point angle=45-para.angle; x=basex-oc*Math.sin(angle*Math.PI/180); y=basey+oc*Math.cos(angle*Math.PI/180); patht.lineTo((float)x,(float)y); patht.close(); canvas.drawPath(patht, paint); } public void drawTriangleB2(Canvas canvas,Paint paint,PhysicsPara para){ Path patht = new Path(); float basex,basey; double x,y; //double diameter=2*baseLength; double edgeLength=2*baseLength; basex=para.px; basey=para.py; double angle; double ao=edgeLength*Math.sqrt(2)/(2*Math.cos(22.5*Math.PI/180)); double oc=edgeLength*(Math.sqrt(2)-1); // first point angle=67.5-para.angle; x=basex-ao*Math.cos(angle*Math.PI/180); y=basey-ao*Math.sin(angle*Math.PI/180); patht.moveTo((float)x,(float)y); // second point angle=22.5-para.angle; x=basex+ao*Math.cos(angle*Math.PI/180); y=basey+ao*Math.sin(angle*Math.PI/180); patht.lineTo((float)x,(float)y); //third point angle=45-para.angle; x=basex-oc*Math.sin(angle*Math.PI/180); y=basey+oc*Math.cos(angle*Math.PI/180); patht.lineTo((float)x,(float)y); patht.close(); canvas.drawPath(patht, paint); } public void drawTriangeM(Canvas canvas,Paint paint,PhysicsPara para){ Path patht = new Path(); float basex,basey; double x,y; double edgeLength=Math.sqrt(2)*baseLength; basex=para.px; basey=para.py; double angle; double ao=edgeLength*Math.sqrt(2)/(2*Math.cos(22.5*Math.PI/180)); double oc=edgeLength*(Math.sqrt(2)-1); // first point angle=67.5-para.angle; x=basex-ao*Math.cos(angle*Math.PI/180); y=basey-ao*Math.sin(angle*Math.PI/180); patht.moveTo((float)x,(float)y); // second point angle=22.5-para.angle; x=basex+ao*Math.cos(angle*Math.PI/180); y=basey+ao*Math.sin(angle*Math.PI/180); patht.lineTo((float)x,(float)y); //third point angle=45-para.angle; x=basex-oc*Math.sin(angle*Math.PI/180); y=basey+oc*Math.cos(angle*Math.PI/180); patht.lineTo((float)x,(float)y); patht.close(); canvas.drawPath(patht, paint); } // draw small triangle 1 public void drawTriangleS1(Canvas canvas,Paint paint,PhysicsPara para){ Path patht = new Path(); float basex,basey; double x,y; double edgeLength=baseLength; basex=para.px; basey=para.py; double angle; double ao=edgeLength*Math.sqrt(2)/(2*Math.cos(22.5*Math.PI/180)); double oc=edgeLength*(Math.sqrt(2)-1); // first point angle=67.5-para.angle; x=basex-ao*Math.cos(angle*Math.PI/180); y=basey-ao*Math.sin(angle*Math.PI/180); patht.moveTo((float)x,(float)y); // second point angle=22.5-para.angle; x=basex+ao*Math.cos(angle*Math.PI/180); y=basey+ao*Math.sin(angle*Math.PI/180); patht.lineTo((float)x,(float)y); //third point angle=45-para.angle; x=basex-oc*Math.sin(angle*Math.PI/180); y=basey+oc*Math.cos(angle*Math.PI/180); patht.lineTo((float)x,(float)y); patht.close(); canvas.drawPath(patht, paint); } // draw small tiangle2 public void drawTriangleS2(Canvas canvas,Paint paint,PhysicsPara para){ Path patht = new Path(); float basex,basey; double x,y; double edgeLength=baseLength; basex=para.px; basey=para.py; double angle; double ao=edgeLength*Math.sqrt(2)/(2*Math.cos(22.5*Math.PI/180)); double oc=edgeLength*(Math.sqrt(2)-1); // first point angle=67.5-para.angle; x=basex-ao*Math.cos(angle*Math.PI/180); y=basey-ao*Math.sin(angle*Math.PI/180); patht.moveTo((float)x,(float)y); // second point angle=22.5-para.angle; x=basex+ao*Math.cos(angle*Math.PI/180); y=basey+ao*Math.sin(angle*Math.PI/180); patht.lineTo((float)x,(float)y); //third point angle=45-para.angle; x=basex-oc*Math.sin(angle*Math.PI/180); y=basey+oc*Math.cos(angle*Math.PI/180); patht.lineTo((float)x,(float)y); patht.close(); canvas.drawPath(patht, paint); } public void drawSquare(Canvas canvas,Paint paint,PhysicsPara para){ Path patht = new Path(); float basex,basey; double x,y; double edgeLength=Math.sqrt(2)*baseLength/2; basex=para.px; basey=para.py; float angle; //first point angle=45-para.angle; x=basex-edgeLength*Math.cos(angle*Math.PI/180); y=basey-edgeLength*Math.sin(angle*Math.PI/180); patht.moveTo((float)x,(float)y); //second point angle=45+para.angle; x=basex+edgeLength*Math.cos(angle*Math.PI/180); y=basey-edgeLength*Math.sin(angle*Math.PI/180); patht.lineTo((float)x,(float)y); //third point angle=45-para.angle; x=basex+edgeLength*Math.cos(angle*Math.PI/180); y=basey+edgeLength*Math.sin(angle*Math.PI/180); patht.lineTo((float)x,(float)y); //fourth point angle=45+para.angle; x=basex-edgeLength*Math.cos(angle*Math.PI/180); y=basey+edgeLength*Math.sin(angle*Math.PI/180); patht.lineTo((float)x,(float)y); patht.close(); canvas.drawPath(patht, paint); } public void drawParallelogram( Canvas canvas, Paint paint,PhysicsPara para){ //画一个正方向平行四边形 Path patht=new Path(); float basex ,basey; double x,y; double edgeLength=baseLength; basex=para.px; basey=para.py; double angle; //first point angle=22.5-para.angle; x=basex-edgeLength*Math.sqrt(5)*Math.cos(angle*Math.PI/180)/2; y=basey-edgeLength*Math.sqrt(5)*Math.sin(angle*Math.PI/180)/2; patht.moveTo((float)x,(float)y); //second point angle=45+para.angle; x=basex+edgeLength*Math.cos(angle*Math.PI/180)/2; y=basey-edgeLength*Math.sin(angle*Math.PI/180)/2; patht.lineTo((float)x,(float)y); //third point angle=22.5-para.angle; x=basex+edgeLength*Math.sqrt(5)*Math.cos(angle*Math.PI/180)/2; y=basey+edgeLength*Math.sqrt(5)*Math.sin(angle*Math.PI/180)/2; patht.lineTo((float)x,(float)y); //fourth point angle=45+para.angle; x=basex-edgeLength*Math.cos(angle*Math.PI/180)/2; y=basey+edgeLength*Math.sin(angle*Math.PI/180)/2; patht.lineTo((float)x,(float)y); patht.close(); canvas.drawPath(patht, paint); } public void drawRect(Canvas canvas, Paint paint,Point point){ //draw a canvas.drawRect(10, 80, 70, 140, paint); } public void drawButtonRotation(Canvas canvas, Paint paint){ //canvas.drawRect(10, 80, 70, 140, paint); } public void drawPhysics(Canvas canvas, Paint paint){ drawTriangleB1(canvas, paint,dataPhysic.TriangleB1); drawTriangleB2(canvas, paint,dataPhysic.TriangleB2); drawTriangeM(canvas, paint,dataPhysic.TriangleM); drawTriangleS1(canvas, paint,dataPhysic.TriangleS1); drawTriangleS2(canvas, paint,dataPhysic.TriangleS2); drawSquare(canvas, paint,dataPhysic.Square); drawParallelogram(canvas, paint,dataPhysic.parallelogram); drawButtonRotation(canvas,paint); } }
DataPhysics.java 用于定义所有图形的尺寸,并缓存每个图形的基本参数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @description: 3 * This file save all of the physic data include angle and coordinate. 4 * @author: warren 5 * @email: warrenqin@hotmail.com 6 * @date: 2012.1.10 7 */ 8 9 package com.my.game; 10 11 import android.graphics.Point; 12 import android.util.Log; 13 14 public class DataPhysics { 15 16 static DataPhysics instance=new DataPhysics(); 17 //define button size and position 18 static int RotateButtonWidth =50; 19 static int RotateButtonHeight=20; 20 static Point ButtonPoint=new Point(100,100); 21 22 //define physics base length 23 // if you want to change the all of the size , please change baseLength 24 final static int baseLength=100; 25 26 //define array of the physics's point 27 //PhysicsPara[] arryPhysic=new PhysicsPara[7]; 28 29 PhysicsPara TriangleB1; 30 PhysicsPara TriangleB2; 31 PhysicsPara TriangleM ; 32 PhysicsPara TriangleS1; 33 PhysicsPara TriangleS2; 34 PhysicsPara Square; 35 PhysicsPara parallelogram; 36 PhysicsPara[] physicsArry; 37 //={TriangleB1,TriangleB2,TriangeM,TriangleS1,TriangleS2,Square,parallelogram}; 38 39 public DataPhysics(){ 40 TriangleS1 = new PhysicsPara(80,100,0); 41 TriangleS2 = new PhysicsPara(200,100,0); 42 TriangleM = new PhysicsPara(90,250,0); 43 TriangleB2 = new PhysicsPara(100,450,0); 44 TriangleB1 = new PhysicsPara(350,450,0); 45 Square = new PhysicsPara(100,600,0); 46 parallelogram = new PhysicsPara(300,600,4); 47 setRadius(baseLength); 48 physicsArry=new PhysicsPara[7]; 49 physicsArry[0]=TriangleB1; 50 physicsArry[1]=TriangleB2; 51 physicsArry[2]=TriangleM; 52 physicsArry[3]=TriangleS1; 53 physicsArry[4]=TriangleS2; 54 physicsArry[5]=Square; 55 physicsArry[6]=parallelogram; 56 57 } 58 59 //while quit game then save all of the physics data 60 public void saveData(){ 61 // not do it 62 63 } 64 65 public void setRadius(int ibaselength){ 66 double buf; 67 Log.d("qcw", "setRadius"); 68 System.out.println(ibaselength); 69 // 70 buf=2*ibaselength*(1-Math.cos(45*Math.PI/180)); 71 System.out.println(buf); 72 TriangleB1.setRadius((float) buf); 73 TriangleB2.setRadius((float) buf); 74 // 75 buf=Math.sqrt(2)*ibaselength*(1-Math.cos(45*Math.PI/180)); 76 System.out.println(buf); 77 TriangleM.setRadius((float)buf); 78 79 // 80 buf=ibaselength*(1-Math.cos(45*Math.PI/180)); 81 System.out.println(buf); 82 TriangleS1.setRadius((float)buf); 83 TriangleS2.setRadius((float)buf); 84 // 85 buf=ibaselength/2; 86 System.out.println(buf); 87 Square.setRadius((float)buf); 88 parallelogram.setRadius((float)buf); 89 Log.d("qcw", "out setRadius"); 90 91 } 92 93 94 }
LogicPhysics.java 主要实现了是否被选中 以及 单击 双击 事件的检测等。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 * @description: 3 * 4 * @author: warren 5 * @email: warrenqin@hotmail.com 6 * @date: 2012.1.10 7 */ 8 package com.my.game; 9 10 public class LogicPhysics { 11 12 public DataPhysics dataphysics=DataPhysics.instance; 13 private int physicSelectIndex; 14 String Tag="LogicPhysics"; 15 public LogicPhysics(){ 16 physicSelectIndex=8; 17 } 18 public int checkSelected(float x,float y){ 19 int i=0; 20 int x1,y1; 21 double d; 22 float r; 23 //Log.d(Tag, "Enter checkselected"); 24 for(i=0;i<7;i++){ 25 x1=dataphysics.physicsArry[i].getX(); 26 y1=dataphysics.physicsArry[i].getY(); 27 d= Math.sqrt( (x1-x)*(x1-x) + (y1-y)*(y1-y)); 28 //System.out.println(d); 29 r=dataphysics.physicsArry[i].getRadius(); 30 //System.out.println(r); 31 if(d<=r){ 32 // System.out.println(i); 33 // Log.d(Tag, "Out checkselected"); 34 return i; 35 } 36 } 37 // Log.d(Tag, "Out checkselected"); 38 return 8; 39 } 40 public void setSelect(int index){ 41 physicSelectIndex=index; 42 } 43 public void cancelSelect(){ 44 physicSelectIndex=8; 45 } 46 public void oneClickEvent(float x,float y){ 47 if(physicSelectIndex<7){ 48 dataphysics.physicsArry[physicSelectIndex].angle+=45; 49 }else{ 50 51 } 52 } 53 54 public void doubleClickEvent(float x,float y){ 55 if(physicSelectIndex<7){ 56 dataphysics.physicsArry[physicSelectIndex].angle-=45; 57 }else{ 58 59 } 60 } 61 public void scrollEvent(float x,float y){ 62 if(physicSelectIndex<7){ 63 dataphysics.physicsArry[physicSelectIndex].px=(int)x; 64 dataphysics.physicsArry[physicSelectIndex].py=(int)y; 65 }else{ 66 67 } 68 69 } 70 71 public void longPressEvent(float x,float y){ 72 73 if(physicSelectIndex<7){ 74 75 }else{ 76 77 } 78 } 79 80 }
代码就这些了,我是在M9上调试的,没有在其他机器上试过。
操作方式:双击可旋转,单击选择后拖动
注意:
如果要在其他机器上运行请自行修改DataPhysics.java 中的相关参数: baseLength 决定所有图形的大小、DataPhysics()中初始化了七个图形的初始位置(如果显示少了图形,修改这里)。
问题:没有做边界检测,没有做翻转、双击旋转的角度是固定的 、其他