package whu.iss.sric.view; |
import java.util.ArrayList; |
import java.util.List; |
import whu.iss.sric.android.R; |
import android.app.Activity; |
import android.content.Context; |
import android.content.res.Resources; |
import android.graphics.Bitmap; |
import android.graphics.Canvas; |
import android.graphics.Color; |
import android.graphics.Paint; |
import android.graphics.Point; |
import android.graphics.Rect; |
import android.graphics.drawable.Drawable; |
import android.util.AttributeSet; |
import android.util.DisplayMetrics; |
import android.view.View; |
public class BoardView extends View { |
/** |
* xCount x轴方向的图标数+1 |
*/ |
protected static final int xCount = 10 ; |
/** |
* yCount y轴方向的图标数+1 |
*/ |
protected static final int yCount = 12 ; |
/** |
* map 连连看游戏棋盘 |
*/ |
protected int [][] map = new int [xCount][yCount]; |
/** |
* iconSize 图标大小 |
*/ |
protected int iconSize; |
/** |
* iconCounts 图标的数目 |
*/ |
protected int iconCounts = 19 ; |
/** |
* icons 所有的图片 |
*/ |
protected Bitmap[] icons = new Bitmap[iconCounts]; |
/** |
* path 可以连通点的路径 |
*/ |
private Point[] path = null ; |
/** |
* selected 选中的图标 |
*/ |
protected List<Point> selected = new ArrayList<Point>(); |
public BoardView(Context context, AttributeSet atts) { |
super (context, atts); |
calIconSize(); |
Resources r = getResources(); |
loadBitmaps( 1 , r.getDrawable(R.drawable.fruit_01)); |
loadBitmaps( 2 , r.getDrawable(R.drawable.fruit_02)); |
loadBitmaps( 3 , r.getDrawable(R.drawable.fruit_03)); |
loadBitmaps( 4 , r.getDrawable(R.drawable.fruit_04)); |
loadBitmaps( 5 , r.getDrawable(R.drawable.fruit_05)); |
loadBitmaps( 6 , r.getDrawable(R.drawable.fruit_06)); |
loadBitmaps( 7 , r.getDrawable(R.drawable.fruit_07)); |
loadBitmaps( 8 , r.getDrawable(R.drawable.fruit_08)); |
loadBitmaps( 9 , r.getDrawable(R.drawable.fruit_09)); |
loadBitmaps( 10 , r.getDrawable(R.drawable.fruit_10)); |
loadBitmaps( 11 , r.getDrawable(R.drawable.fruit_11)); |
loadBitmaps( 12 , r.getDrawable(R.drawable.fruit_12)); |
loadBitmaps( 13 , r.getDrawable(R.drawable.fruit_13)); |
loadBitmaps( 14 , r.getDrawable(R.drawable.fruit_14)); |
loadBitmaps( 15 , r.getDrawable(R.drawable.fruit_15)); |
loadBitmaps( 16 , r.getDrawable(R.drawable.fruit_17)); |
loadBitmaps( 17 , r.getDrawable(R.drawable.fruit_18)); |
loadBitmaps( 18 , r.getDrawable(R.drawable.fruit_19)); |
} |
/** |
* |
* 计算图标的长宽 |
*/ |
private void calIconSize() { |
DisplayMetrics dm = new DisplayMetrics(); |
((Activity) this .getContext()).getWindowManager().getDefaultDisplay() |
.getMetrics(dm); |
iconSize = dm.widthPixels / (xCount); |
} |
/** |
* |
* @param key |
* 特定图标的标识 |
* @param d |
* drawable下的资源 |
*/ |
public void loadBitmaps( int key, Drawable d) { |
Bitmap bitmap = Bitmap.createBitmap(iconSize, iconSize, |
Bitmap.Config.ARGB_8888); |
Canvas canvas = new Canvas(bitmap); |
d.setBounds( 0 , 0 , iconSize, iconSize); |
d.draw(canvas); |
icons[key] = bitmap; |
} |
@Override |
protected void onDraw(Canvas canvas) { |
/** |
* 绘制连通路径,然后将路径以及两个图标清除 |
*/ |
if (path != null && path.length >= 2 ) { |
for ( int i = 0 ; i < path.length - 1 ; i++) { |
Paint paint = new Paint(); |
paint.setColor(Color.CYAN); |
paint.setStyle(Paint.Style.STROKE); |
paint.setStrokeWidth( 3 ); |
Point p1 = indextoScreen(path[i].x, path[i].y); |
Point p2 = indextoScreen(path[i + 1 ].x, path[i + 1 ].y); |
canvas.drawLine(p1.x + iconSize / 2 , p1.y + iconSize / 2 , p2.x |
+ iconSize / 2 , p2.y + iconSize / 2 , paint); |
} |
Point p = path[ 0 ]; |
map[p.x][p.y] = 0 ; |
p = path[path.length - 1 ]; |
map[p.x][p.y] = 0 ; |
selected.clear(); |
path = null ; |
} |
/** |
* 绘制棋盘的所有图标 当这个坐标内的值大于0时绘制 |
*/ |
for ( int x = 0 ; x < map.length; x += 1 ) { |
for ( int y = 0 ; y < map[x].length; y += 1 ) { |
if (map[x][y] > 0 ) { |
Point p = indextoScreen(x, y); |
canvas.drawBitmap(icons[map[x][y]], p.x, p.y, null ); |
} |
} |
} |
/** |
* 绘制选中图标,当选中时图标放大显示 |
*/ |
for (Point position : selected) { |
Point p = indextoScreen(position.x, position.y); |
if (map[position.x][position.y] >= 1 ) { |
canvas.drawBitmap(icons[map[position.x][position.y]], null , |
new Rect(p.x - 5 , p.y - 5 , p.x + iconSize + 5 , p.y |
+ iconSize + 5 ), null ); |
} |
} |
} |
/** |
* |
* @param path |
*/ |
public void drawLine(Point[] path) { |
this .path = path; |
this .invalidate(); |
} |
/** |
* 工具方法 |
* |
* @param x |
* 数组中的横坐标 |
* @param y |
* 数组中的纵坐标 |
* @return 将图标在数组中的坐标转成在屏幕上的真实坐标 |
*/ |
public Point indextoScreen( int x, int y) { |
return new Point(x * iconSize, y * iconSize); |
} |
/** |
* 工具方法 |
* |
* @param x |
* 屏幕中的横坐标 |
* @param y |
* 屏幕中的纵坐标 |
* @return 将图标在屏幕中的坐标转成在数组上的虚拟坐标 |
*/ |
public Point screenToindex( int x, int y) { |
int ix = x / iconSize; |
int iy = y / iconSize; |
if (ix < xCount && iy < yCount) { |
return new Point(ix, iy); |
} else { |
return new Point( 0 , 0 ); |
} |
} |
} |
初级程序员
by: 小蘑菇 发表于:2013-05-05 22:53:30 顶(1) | 踩(0) 回复
沙发,我要积分啊,网站真好
回复评论