Android实用技巧.动画效果(三)

动画效果绘制界面——SurfaceView


这种方式适合做小游戏,界面刷新频繁,动画动作比较灵活
推荐一本书:

Android编程之从零开始

package com.example.administrator.androidbase.two;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.hardware.camera2.params.MeteringRectangle;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

import com.example.administrator.androidbase.R;

/**
 * Created by Dujq on 2016/12/22.
 */
public class DrawView extends SurfaceView implements SurfaceHolder.Callback
        , Runnable {
    private SurfaceHolder holder;
    private int bmpX, bmpY;
    private Paint paint;
    private Thread th;
    //线程消亡标志位
    private boolean flag;
    private Canvas canvas;
    private int screenW, screenH;
    private Bitmap fishCut;
    private Bitmap fish[] = new Bitmap[10];
    private int currentFrame = 0;
    private boolean isReight = true;
    public DrawView(Context context) {
        super(context);
        holder = this.getHolder();
        holder.addCallback(this);
        paint = new Paint();
        paint.setColor(getResources().getColor(R.color.colorAccent));
        //设置焦点,暂时没起作用
        setFocusable(true);
    }

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        screenH = this.getHeight();
        screenW = this.getWidth();
        bmpX = 0;
        bmpY = screenH / 2;
        flag = true;
        th = new Thread(this);
        for (int i = 0; i < fish.length; i++) {
            fish[i] = BitmapFactory.decodeResource(getResources(), R.mipmap.fish0 + i);
        }
        fishCut = BitmapFactory.decodeResource(getResources(), R.mipmap.fish);
        th.start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        flag = false;
    }

    public void initDraw() {
        try {
            canvas = holder.lockCanvas();
            if (canvas != null) {
                //刷新画布.绘制矩形new画布
//                canvas.drawRect(0,0,this.getWidth(),this.getHeight(),paint);
                canvas.drawColor(getResources().getColor(R.color.white));
                if (isReight) {
                    //画布镜像 画布以x轴180度旋转
                    canvas.scale(-1, 1, bmpX, 0);
                    canvas.drawBitmap(fish[currentFrame], bmpX - fish[currentFrame].getWidth(), bmpY - fish[currentFrame].getHeight() / 2, paint);
                } else {
                    //绘制图像,绘制点为图像的左上角
                    canvas.drawBitmap(fish[currentFrame], bmpX
                            , bmpY - fish[currentFrame].getHeight() / 2, paint);
                }
                //.save()与.restore成对出现,添加view
                canvas.save();
                //设置画布可视大小
                canvas.clipRect(bmpX, screenH / 3, bmpX + fishCut.getWidth() / 10, screenH / 3 + fishCut.getHeight());
                canvas.drawBitmap(fishCut, bmpX - currentFrame * fishCut.getWidth() / 10, screenH / 3, paint);
                canvas.restore();

            }
        } catch (Exception e) {
        } finally {
            if (canvas != null) {
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }

    @Override
    public void run() {
        while (flag) {
            long start = System.currentTimeMillis();
            initDraw();
            logic();
            long end = System.currentTimeMillis();
            try {
//                刷新画布时间强制>=50
                if (end - start < 50) {
                    Thread.sleep(50 - (end - start));
                }
            } catch (Exception e) {

            }
        }
    }

    /**
     * 界面刷新逻辑
     */
    private void logic() {
        initDirection();
        initFrame();
    }

    private void initDirection() {
        if (bmpX > screenW) {
            isReight = false;
        }
        if (bmpX < -fish[currentFrame].getWidth()) {
            isReight = true;
        }
        if (isReight) {
            bmpX += 2;
        } else {
            bmpX -= 2;
        }

    }

    private void initFrame() {
        currentFrame++;
        if (currentFrame >= fish.length)
            currentFrame = 0;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
//        return super.onTouchEvent(event);
        return true;
    }

}

界面绘制完成建立activity调用View
public class DrawViewActivity extends Activity {
    private DrawView drawView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //隐去标题栏
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        //隐去状态栏
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
                , WindowManager.LayoutParams.FLAG_FULLSCREEN);
        drawView = new DrawView(this);
//        view.setFocusable(true);
        setContentView(drawView);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风晴03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值