简单弹球游戏
package com.example.imagetest;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import java.lang.ref.WeakReference;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends Activity
{
private float tableWidth;
private float tableHeight;
private float racketY;
private float racketHeight;
private float racketWidth;
private float ballSize;
private int ySpeed = 15;
private Random rand = new Random();
private double xyRate = rand.nextDouble() - 0.5;
private int xSpeed = (int) (ySpeed * xyRate * 2.0);
private float ballX = rand.nextInt(200) + 20f;
private float ballY = rand.nextInt(10) + 60f;
private float racketX = rand.nextInt(200);
private boolean isLose;
private GameView gameView;
static class MyHandler extends Handler
{
private WeakReference<MainActivity> activity;
MyHandler(WeakReference<MainActivity> activity)
{
this.activity = activity;
}
@Override
public void handleMessage(Message msg)
{
if (msg.what == 0x123)
{
activity.get().gameView.invalidate();
}
}
}
private Handler handler = new MyHandler(new WeakReference<>(this));
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
racketHeight = getResources().getDimension(R.dimen.racket_height);
racketWidth = getResources().getDimension(R.dimen.racket_width);
ballSize = getResources().getDimension(R.dimen.ball_size);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
gameView = new GameView(this);
setContentView(gameView);
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
tableWidth = metrics.widthPixels;
tableHeight = metrics.heightPixels;
racketY = tableHeight - 80;
gameView.setOnTouchListener((source, event) -> {
if (event.getX() <= tableWidth / 10)
{
if (racketX > 0) racketX -= 10;
}
if (event.getX() >= tableWidth * 9 / 10)
{
if (racketX < tableWidth - racketWidth) racketX += 10;
}
return true;
});
Timer timer = new Timer();
timer.schedule(new TimerTask()
{
@Override
public void run()
{
if (ballX < ballSize || ballX >= tableWidth - ballSize)
{
xSpeed = -xSpeed;
}
if (ballY >= racketY - ballSize &&
(ballX < racketX || ballX > racketX + racketWidth))
{
timer.cancel();
isLose = true;
}
else if (ballY < ballSize || (ballY >= racketY - ballSize &&
ballX > racketX && ballX <= racketX + racketWidth))
{
ySpeed = -ySpeed;
}
ballY += ySpeed;
ballX += xSpeed;
handler.sendEmptyMessage(0x123);
}
}, 0, 100);
}
class GameView extends View
{
private Paint paint = new Paint();
private RadialGradient mShader = new RadialGradient(-ballSize/ 2,
-ballSize/ 2, ballSize, Color.WHITE, Color.RED, Shader.TileMode.CLAMP);
public GameView(Context context)
{
super(context);
setFocusable(true);
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
}
@Override
public void onDraw(Canvas canvas)
{
if (isLose)
{
paint.setColor(Color.RED);
paint.setTextSize(40f);
canvas.drawText("游戏已结束", tableWidth / 2 - 100, 200f, paint);
}
else
{
canvas.save();
canvas.translate(ballX, ballY);
paint.setShader(mShader);
canvas.drawCircle(0f, 0f, ballSize, paint);
canvas.restore();
paint.setShader(null);
paint.setColor(Color.rgb(80, 80, 200));
canvas.drawRect(racketX, racketY, racketX + racketWidth,
racketY + racketHeight, paint);
}
}
}
}
扭曲图片
package com.example.ima;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.util.Spliterator;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this,R.drawable.jinta));
}
private class MyView extends View{
private final static int WIDTH=20;
private final static int HEIGHT=20;
private final static int COUNT=(WIDTH+1)*(HEIGHT+1);
private float[] verts = new float[COUNT*2];
private float[] orig=new float[COUNT*2];
private Bitmap bitmap;
public MyView(Context context, int drawableId) {
super(context);
setFocusable(true);
bitmap= BitmapFactory.decodeResource(getResources(),drawableId);
float bitmapWidth = bitmap.getWidth();
float bitmapHeight = bitmap.getHeight();
int index=0;
for (int y=0;y<HEIGHT;y++){
float fy=bitmapHeight*y/HEIGHT;
for (int x=0;x<=WIDTH;x++){
float fx=bitmapWidth*x/WIDTH;
verts[index*2]=fx;
orig[index*2]=verts[index*2];
verts[index*2+1]=fy;
orig[index*2+1]=verts[index*2+1];
index++;
}
}
setBackgroundColor(Color.WHITE);
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawBitmapMesh(bitmap,WIDTH,HEIGHT,verts,0,null,0,null);
}
private void wrap(float cx,float cy){
for (int i = 0; i < COUNT*2; i+=2) {
float dx = cx-orig[i];
float dy = cx-orig[i+1];
float dd = dx*dx+dy*dy;
float d = (float) Math.sqrt(dd);
float pull = 20000/(dd*d);
if(pull>=1){
verts[i]=cx;
verts[i+1]=cy;
}
else {
verts[i]=orig[i]+dx*pull;
verts[i+1]=orig[i+1]+dy*pull;
}
}
invalidate();
}
@Override
public boolean onTouchEvent(MotionEvent event){
wrap(event.getX(),event.getY());
return true;
}
}
}
大珠小珠落玉盘
package com.example.crazyit;
import androidx.appcompat.app.AppCompatActivity;
import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.widget.LinearLayout;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
public static final float BALL_SIZE=50f;
public static final float FULL_TIME=1000f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout container=findViewById(R.id.container);
container.addView(new MyAnimationView(this));
}
class MyAnimationView extends View{
List<ShapeHolder> balls = new ArrayList<ShapeHolder>();
public MyAnimationView(Context context) {
super(context);
ObjectAnimator colorAnim = (ObjectAnimator) AnimatorInflater.loadAnimator(MainActivity.this,R.animator.color_anim);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setTarget(this);
colorAnim.start();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction()!=MotionEvent.ACTION_DOWN&&event.getAction()!=MotionEvent.ACTION_MOVE){
return false;
}
ShapeHolder newBall = addBall(event.getX(),event.getY());
float startY=newBall.getY();
float endY=getHeight()-BALL_SIZE;
float h=getHeight();
float eventY=event.getY();
int duration = (int) (FULL_TIME*(h-eventY)/h);
ObjectAnimator fallAnim = ObjectAnimator.ofFloat(newBall,"y",startY,endY);
fallAnim.setDuration(duration);
fallAnim.setInterpolator(new AccelerateInterpolator());
ObjectAnimator squashAnim1=ObjectAnimator.ofFloat(newBall,"x",newBall.getX(),newBall.getX()-BALL_SIZE/2);
squashAnim1.setDuration(duration/4);
squashAnim1.setRepeatCount(1);
squashAnim1.setRepeatMode(ValueAnimator.REVERSE);
squashAnim1.setInterpolator(new DecelerateInterpolator());
ObjectAnimator squashAnim2=ObjectAnimator.ofFloat(newBall,"width",newBall.getWidth(),newBall.getWidth()+BALL_SIZE);
squashAnim2.setDuration(duration/4);
squashAnim2.setRepeatCount(1);
squashAnim2.setRepeatMode(ValueAnimator.REVERSE);
squashAnim2.setInterpolator(new DecelerateInterpolator());
ObjectAnimator bounceBackAnim=ObjectAnimator.ofFloat(newBall,"y",endY,startY);
bounceBackAnim.setDuration(duration);
bounceBackAnim.setInterpolator(new DecelerateInterpolator());
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(fallAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(bounceBackAnim).after(squashAnim2);
ObjectAnimator fadeAnim=ObjectAnimator.ofFloat(newBall,"alpha",1f,0f);
fadeAnim.setDuration(250);
fadeAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
balls.remove(((ObjectAnimator)animation).getTarget());
}
});
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();
return true;
}
private ShapeHolder addBall(float x,float y){
OvalShape circle = new OvalShape();
circle.resize(BALL_SIZE,BALL_SIZE);
ShapeDrawable drawable = new ShapeDrawable(circle);
ShapeHolder shapeHolder = new ShapeHolder(drawable);
shapeHolder.setX(x-BALL_SIZE/2);
shapeHolder.setY(y-BALL_SIZE/2);
int red = (int) (Math.random()*255);
int green = (int) (Math.random()*255);
int blue = (int) (Math.random()*255);
int color = -0x1000000|(red/4<<16)|(green/4<<8)|blue;
Paint paint = drawable.getPaint();
int darkColor = (-0x1000000|(red/4<<15)|(green/4<<8)|blue/4);
RadialGradient gradient = new RadialGradient(37.2f,12.5f,BALL_SIZE,color,darkColor, Shader.TileMode.CLAMP);
paint.setShader(gradient);
shapeHolder.setPaint(paint);
balls.add(shapeHolder);
return shapeHolder;
}
@Override
protected void onDraw(Canvas canvas) {
for (ShapeHolder shapeHolder:balls){
canvas.save();
canvas.translate(shapeHolder.getX(),shapeHolder.getY());
shapeHolder.getShape().draw(canvas);
canvas.restore();
}
}
}
}
package com.example.crazyit;
import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.Shape;
public class ShapeHolder {
private float x=0,y=0;
private ShapeDrawable shape;
private int color;
private RadialGradient gradient;
private float alpha=1f;
private Paint paint;
public ShapeHolder(ShapeDrawable shape) {
this.shape = shape;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
public ShapeDrawable getShape() {
return shape;
}
public void setShape(ShapeDrawable shape) {
this.shape = shape;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public RadialGradient getGradient() {
return gradient;
}
public void setGradient(RadialGradient gradient) {
this.gradient = gradient;
}
public float getAlpha() {
return alpha;
}
public void setAlpha(float alpha) {
this.alpha = alpha;
}
public Paint getPaint() {
return paint;
}
public void setPaint(Paint paint) {
this.paint = paint;
}
public float getWidth(){
return shape.getShape().getWidth();
}
public void setWidth(float width){
Shape s = shape.getShape();
s.resize(width,s.getWidth());
}
public float getHeight(){
return shape.getShape().getHeight();
}
public void setHeight(float width){
Shape s = shape.getShape();
s.resize(width,s.getHeight());
}
}
示波器
package com.example.shiboqi;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private SurfaceHolder holder;
private Paint paint = new Paint();
int HEIGHT = 400;
int screenWidth;
int X_OFFSET = 5;
int cx = X_OFFSET;
int centerY = HEIGHT/2;
Timer timer = new Timer();
TimerTask task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth=metrics.widthPixels;
SurfaceView surfaceView = findViewById(R.id.show);
holder = surfaceView.getHolder();
paint.setColor(Color.GREEN);
paint.setStrokeWidth(getResources().getDimension(R.dimen.stroke_width));
Button sin = findViewById(R.id.sin);
Button cos = findViewById(R.id.cos);
View.OnClickListener listener=source->{
drawBack(holder);
cx=X_OFFSET;
if(task!=null){
task.cancel();
}
task=new TimerTask() {
@Override
public void run() {
paint.setColor(Color.GREEN);
int cy = source.getId() == R.id.sin?centerY-(int) (100*Math.sin((cx-5)*2*Math.PI/150)):centerY-(int) (100*Math.cos((cx-5)*2*Math.PI/150));
Canvas canvas = holder.lockCanvas(new Rect(cx,cy,cx+(int) paint.getStrokeWidth(),cy+(int) paint.getStrokeWidth()));
canvas.drawPoint(cx,cy,paint);
cx+=2;
if(cx>screenWidth){
task.cancel();
task=null;
}
holder.unlockCanvasAndPost(canvas);
}
};
timer.schedule(task,0,10);
};
sin.setOnClickListener(listener);
cos.setOnClickListener(listener);
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
}
@Override
public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) {
drawBack(holder);
}
@Override
public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {
timer.cancel();
}
});
}
private void drawBack(SurfaceHolder holder){
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.WHITE);
paint.setColor(Color.BLACK);
canvas.drawLine(X_OFFSET,centerY,screenWidth,centerY,paint);
canvas.drawLine(X_OFFSET,40f,X_OFFSET,HEIGHT,paint);
holder.unlockCanvasAndPost(canvas);
holder.lockCanvas(new Rect(0,0,0,0));
holder.unlockCanvasAndPost(canvas);
}
}