【问题标题】:Canvas layout with SurfaceView使用 SurfaceView 的画布布局
【发布时间】:2012-04-30 11:31:50
【问题描述】:

我试图让图像移动。图像不动,有时会闪烁。 我想让它可运行。它使用一个 Surface Holder,s 是位图。画布有时保持静止在 i=0 或闪烁。如何让它可以运行

package com.smiley;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SmileyView extends SurfaceView implements SurfaceHolder.Callback {
    public SmileyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        holder = getHolder();
         s= BitmapFactory.decodeResource(context.getResources(),R.drawable.smiley);
         holder.addCallback(this);
    }

    @Override
public boolean onKeyUp(int keyCode, KeyEvent msg) {
    super.onKeyUp(keyCode, msg);

    rv.update();

    return true;
    }
private int i=0;
    private Bitmap s;private SurfaceHolder holder;private RenderView rv ;
     boolean grun=true;long t=0;
    public void resume()
    {
        rv=new RenderView();
    }


    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        // TODO Auto-generated method stub
        grun=true;
        if(rv!=null)
        rv.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        // TODO Auto-generated method stub
    try {
        grun =false;
        rv.join();
        rv=null;
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }


class RenderView extends Thread  {

    RenderView(){
    super();

    }
    @Override
    public void run()
    {
        SurfaceHolder h=holder;
        while(grun)
        {
            Canvas ca=null;
            try{ca = h.lockCanvas(null);
               synchronized (h) {
            update();   dodraw(ca);
               }
            }
            finally
            {
                if(ca!=null)
                h.unlockCanvasAndPost(ca);
            }
        }
    }
    public void dodraw(Canvas canvas)
    {   canvas.drawBitmap(s, i, i , null);

        canvas.restore();
    }
    public void update()
    {  
        if(i==0)
                  i=100;
    }
}
}

【问题讨论】:

    标签: android android-layout surfaceview android-canvas


    【解决方案1】:

    我为您在这里想要做的事情制作了一个教程。您可以查看here。如果我不得不猜测,那么可能是没有清理画布的问题。尝试将其更改为(假设您的背景是位图 backBG)

    public void dodraw(Canvas canvas)
        {   
            canvas.drawBitmap(backBG, 0, 0, null);
            canvas.drawBitmap(s, i, i , null);
    
            canvas.restore();
        }
    

    【讨论】:

    • 如果背景是位图则
    • 尝试将编辑后的答案切换出 backBG 作为背景名称
    • 现在我尝试通过 on key 方法更改 i 的值。但是当我按下按钮时,位置不会改变。我也使用了 canvas.drawcolor。
    • 甚至没有注意到这一点,但猜测 super.onKeyUp 正在从该函数返回您,请尝试将其注释掉。
    • @user1318755 你搞定了吗?如果是,请接受答案
    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多