#2
邓士林2015-07-09 12:21
|
程序代码:
package com.example.androidtest;
import java.util.ArrayList;
import java.util.Collections;
import java. java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
public class gameView extends View {
private Bitmap bg;
private Bitmap background;//背景图片
private Paint paint;
private int screenW;
private int screenH;
private int pw;
private int ph;
public static Rect puzzRect;
private Bitmap puzzImage;//拼图图片。
private Rect thumbRect;//拼图缩放区域
private static int line;
private static int list;
private List<PuzzleCell> bitImages=new ArrayList<PuzzleCell>();//小图片
private List<Rect> RectPiece=new ArrayList<Rect>();
public gameView(Context context) {
super(context);
paint=new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
line = gameActivity.line;
list = gameActivity.list;
}
//画背景图,画格子,画小图片
@Override
protected void onDraw(Canvas canvas) {
Set<Integer> indexs=new HashSet<Integer>();
super.onDraw(canvas);
canvas.drawBitmap(background,0, 0, null);
canvas.drawRect(puzzRect,paint);
// canvas.drawBitmap(puzzImage, null,puzzRect,null);
canvas.drawBitmap(puzzImage, null,thumbRect,null);
int value=(int)ph;
int value1=(int)pw;
for(int i=0;i< line;i++){
canvas.drawLine(puzzRect.left, puzzRect.top+value*(i+1), puzzRect.right, puzzRect.top+value*(i+1), paint);
}
for(int i=0;i< list;i++){
canvas.drawLine(puzzRect.left+value1*(i+1), puzzRect.top,puzzRect.left+value1*(i+1), puzzRect.bottom, paint);
}
makeRectPiece();//
for(int i=bitImages.size()-1;i>=0;i--){
PuzzleCell cell=bitImages.get(i);
int count;
count=(int)(Math.random()*(line*list));
while(true){
if(indexs.contains(count)==true){
count=(int)(Math.random()*(line*list));
}
else{
indexs.add(count);
break;
}
}
cell.draw(canvas,RectPiece.get(count));
}
}
//获取切割的方格
private void makeRectPiece() {
// TODO Auto-generated method stub
for(int i=0;i<line;i++){
for(int j=0;j<list;j++){
Rect r=new Rect(puzzRect.left+j*pw,puzzRect.top+i*ph,puzzRect.left+pw*(j+1),puzzRect.top+ph*(i+1));
RectPiece.add(r);
}
}
}
@Override
//画方格,画拼图区域,加载图片
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO Auto-generated method stub
super.onSizeChanged(w, h, oldw, oldh);
if(w>h){
screenW=w;
screenH=h;
}
else{
screenW=h;
screenH=w;
}
pw=(int) ((screenW-dip2px(10)-dip2px(10)-dip2px(10))/(list+1.5));
ph=(screenH-dip2px(20)-dip2px(20))/line;
puzzRect = new Rect(dip2px(10),dip2px(20),dip2px(10)+(int)(list*pw),dip2px(20)+(int)(line*ph));
thumbRect=new Rect(puzzRect.width()+dip2px(10)+dip2px(10),dip2px(20),screenW-dip2px(10),dip2px(20)+ph);
bg=BitmapFactory.decodeResource(getResources(),R.drawable.wallpaper);//加载背景图片
background=Bitmap.createScaledBitmap(bg,screenW, screenH, false);//设置背景图片,并且缩放
bg.recycle();//释放原始拼图图像。
Bitmap pic=BitmapFactory.decodeResource(getResources(), R.drawable.pic02);//加载拼图图片
puzzImage = Bitmap.createScaledBitmap(pic, puzzRect.width(), puzzRect.height(), false);
pic.recycle();
splitImage();
}
//切割图片
private void splitImage() {
// TODO Auto-generated method stub
Set<Integer> indexs=new HashSet<Integer>();
Rect puzzR;
for(int i=0;i<line;i++){
for(int j=0;j<list;j++){
puzzR=new Rect(j*pw,i*ph,(j+1)*pw,(i+1)*ph);
PuzzleCell cell=new PuzzleCell();
cell.image=Bitmap.createBitmap(puzzImage, puzzR.left, puzzR.top, puzzR.width(), puzzR.height());
cell.x0=puzzRect.left+j*pw;
cell.y0=puzzRect.top+i*ph;
bitImages.add(cell);
}
}
Collections.sort(bitImages,new Comparator<PuzzleCell>(){
@Override
public int compare(PuzzleCell arg0, PuzzleCell arg1) {
// TODO Auto-generated method stub
return arg0.index-arg1.index;
}
});
}
//像素转化。
private int dip2px(float dip){
final float scale=getResources().getDisplayMetrics().density;
return (int)(dip*scale+0.5);
}
//实现触摸功能。
public boolean onTouchEvent(MotionEvent event){
//获取触摸的动作,和触摸的坐标.
int act=event.getAction();
int x=(int)event.getX();
int y=(int)event.getY();
//根据触摸的动作,做出相应的处理
switch(act){
case MotionEvent.ACTION_DOWN:
for(int i=0;i<bitImages.size();i++){
PuzzleCell cell=bitImages.get(i);
if(cell.isTouched(x, y)){
}
}
}
return false;
}
初学android,看了课本上的拼图,自己想写个,但是不知道如何实现触摸功能,看网上的实现触摸功能的做法,他们设为ImageView,在网上看了一会也不会用,所以请问下,按照我写的能否实现触摸功能呢? import java.util.ArrayList;
import java.util.Collections;
import java. java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
public class gameView extends View {
private Bitmap bg;
private Bitmap background;//背景图片
private Paint paint;
private int screenW;
private int screenH;
private int pw;
private int ph;
public static Rect puzzRect;
private Bitmap puzzImage;//拼图图片。
private Rect thumbRect;//拼图缩放区域
private static int line;
private static int list;
private List<PuzzleCell> bitImages=new ArrayList<PuzzleCell>();//小图片
private List<Rect> RectPiece=new ArrayList<Rect>();
public gameView(Context context) {
super(context);
paint=new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
line = gameActivity.line;
list = gameActivity.list;
}
//画背景图,画格子,画小图片
@Override
protected void onDraw(Canvas canvas) {
Set<Integer> indexs=new HashSet<Integer>();
super.onDraw(canvas);
canvas.drawBitmap(background,0, 0, null);
canvas.drawRect(puzzRect,paint);
// canvas.drawBitmap(puzzImage, null,puzzRect,null);
canvas.drawBitmap(puzzImage, null,thumbRect,null);
int value=(int)ph;
int value1=(int)pw;
for(int i=0;i< line;i++){
canvas.drawLine(puzzRect.left, puzzRect.top+value*(i+1), puzzRect.right, puzzRect.top+value*(i+1), paint);
}
for(int i=0;i< list;i++){
canvas.drawLine(puzzRect.left+value1*(i+1), puzzRect.top,puzzRect.left+value1*(i+1), puzzRect.bottom, paint);
}
makeRectPiece();//
for(int i=bitImages.size()-1;i>=0;i--){
PuzzleCell cell=bitImages.get(i);
int count;
count=(int)(Math.random()*(line*list));
while(true){
if(indexs.contains(count)==true){
count=(int)(Math.random()*(line*list));
}
else{
indexs.add(count);
break;
}
}
cell.draw(canvas,RectPiece.get(count));
}
}
//获取切割的方格
private void makeRectPiece() {
// TODO Auto-generated method stub
for(int i=0;i<line;i++){
for(int j=0;j<list;j++){
Rect r=new Rect(puzzRect.left+j*pw,puzzRect.top+i*ph,puzzRect.left+pw*(j+1),puzzRect.top+ph*(i+1));
RectPiece.add(r);
}
}
}
@Override
//画方格,画拼图区域,加载图片
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO Auto-generated method stub
super.onSizeChanged(w, h, oldw, oldh);
if(w>h){
screenW=w;
screenH=h;
}
else{
screenW=h;
screenH=w;
}
pw=(int) ((screenW-dip2px(10)-dip2px(10)-dip2px(10))/(list+1.5));
ph=(screenH-dip2px(20)-dip2px(20))/line;
puzzRect = new Rect(dip2px(10),dip2px(20),dip2px(10)+(int)(list*pw),dip2px(20)+(int)(line*ph));
thumbRect=new Rect(puzzRect.width()+dip2px(10)+dip2px(10),dip2px(20),screenW-dip2px(10),dip2px(20)+ph);
bg=BitmapFactory.decodeResource(getResources(),R.drawable.wallpaper);//加载背景图片
background=Bitmap.createScaledBitmap(bg,screenW, screenH, false);//设置背景图片,并且缩放
bg.recycle();//释放原始拼图图像。
Bitmap pic=BitmapFactory.decodeResource(getResources(), R.drawable.pic02);//加载拼图图片
puzzImage = Bitmap.createScaledBitmap(pic, puzzRect.width(), puzzRect.height(), false);
pic.recycle();
splitImage();
}
//切割图片
private void splitImage() {
// TODO Auto-generated method stub
Set<Integer> indexs=new HashSet<Integer>();
Rect puzzR;
for(int i=0;i<line;i++){
for(int j=0;j<list;j++){
puzzR=new Rect(j*pw,i*ph,(j+1)*pw,(i+1)*ph);
PuzzleCell cell=new PuzzleCell();
cell.image=Bitmap.createBitmap(puzzImage, puzzR.left, puzzR.top, puzzR.width(), puzzR.height());
cell.x0=puzzRect.left+j*pw;
cell.y0=puzzRect.top+i*ph;
bitImages.add(cell);
}
}
Collections.sort(bitImages,new Comparator<PuzzleCell>(){
@Override
public int compare(PuzzleCell arg0, PuzzleCell arg1) {
// TODO Auto-generated method stub
return arg0.index-arg1.index;
}
});
}
//像素转化。
private int dip2px(float dip){
final float scale=getResources().getDisplayMetrics().density;
return (int)(dip*scale+0.5);
}
//实现触摸功能。
public boolean onTouchEvent(MotionEvent event){
//获取触摸的动作,和触摸的坐标.
int act=event.getAction();
int x=(int)event.getX();
int y=(int)event.getY();
//根据触摸的动作,做出相应的处理
switch(act){
case MotionEvent.ACTION_DOWN:
for(int i=0;i<bitImages.size();i++){
PuzzleCell cell=bitImages.get(i);
if(cell.isTouched(x, y)){
}
}
}
return false;
}