2 magicuser0 magicuser0 于 2016.01.14 16:28 提问

安卓 surfaceview 为什么最初几个循环会延迟

如果我把线程的sleep时间改成1000,就会出现卡屏的现象。大概要卡10秒左右
package com.example.myadd;

import java.util.Random;

import com.example.myob.Soldier;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

public class MyView extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder Myholder = null;
myThread mt;

public MyView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    Myholder = this.getHolder();
    Myholder.addCallback(this);
    mt = new myThread(Myholder);
}

// @Override
// protected void onDraw(Canvas canvas) {
// // TODO Auto-generated method stub
// Soldier soldier = new Soldier();
// soldier.setLeave(2);
// soldier.setLocal(290, 290);
// soldier.doDraw(canvas);
// System.out.println(soldier.getLocal_x());
// super.onDraw(canvas);
// //soldier.run();
// //System.out.println(soldier.getLocal_x());
// //super.onDraw(canvas);
// }
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mt.start();

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

class myThread extends Thread {

    private SurfaceHolder holder;
    Soldier soldier = new Soldier();
    Canvas canvas = null;

    public myThread(SurfaceHolder holder) {
        // TODO Auto-generated constructor stub
        this.holder = holder;
    }

    /*
     * public void run() { int count = 0; while (true) { Canvas c = null;
     * try { synchronized (holder) { c = holder.lockCanvas(null);//
     * 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
     * c.drawColor(Color.BLACK);// 设置画布背景颜色 Paint p = new Paint(); // 创建画笔
     * p.setColor(Color.WHITE); Rect r = new Rect(100, 50, 300, 250);
     * c.drawRect(r, p); c.drawText("这是第" + (count++) + "秒", 100, 310, p);
     * Thread.sleep(1000);// 睡眠时间为1秒
     * 
     * // TODO Auto-generated method stub soldier.setLocal(290, 290);
     * soldier.setLeave(2); float i,j,k,l ; i = j = k = l = 300; while
     * (true) { try { canvas = null; synchronized (holder) { canvas =
     * holder.lockCanvas(); System.out.println("32");
     * 
     * //soldier.doDraw(canvas);
     * 
     * //soldier.move(); Paint p = new Paint(); p.setColor(Color.RED);
     * canvas.drawCircle(i+=10, j+=10, 15, p); } } catch (Exception e) { //
     * TODO: handle exception e.printStackTrace(); } finally { if (c !=
     * null) { holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。
     * 
     * } } } }
     */
    @Override
    public void run() {
        // TODO Auto-generated method stub
        soldier.setLocal(290, 290);
        soldier.setLeave(2);
        float i, j, k, l;
        i = j = k = l = 300;
        while (true) {
            try {
                canvas = null;
                synchronized (holder) {
                    canvas = holder.lockCanvas();
                    System.out.println("32");

                    // soldier.doDraw(canvas);

                    // soldier.move();
                    Paint p = new Paint();
                    p.setColor(Color.RED);
                    canvas.drawCircle(i += 10, j += 10, 15, p);
                    Thread.sleep(10);
                }

            } catch (Exception e) {
                // TODO: handle exception
            } finally {
                //
                holder.unlockCanvasAndPost(canvas);
            }
        }

    }
}

}

1个回答

devmiao
devmiao   Ds   Rxr 2016.01.19 04:41
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android SurfaceView+MediaPlayer实现几个不同的视频轮流播放
MediaPlayer 1)如何获得MediaPlayer实例: 可以使用直接new的方式: MediaPlayer mp = new MediaPlayer(); 也可以使用create的方式,如: MediaPlayer mp = MediaPlayer.create(this, R.raw.test); 网络或是内部存储直接setDataSource一个路径 2) 如何设置要播...
android surfaceview 为什么设置置顶背景才能透明才能透明
为什么要有这句this.setZOrderOnTop(true);下一句才生效 //        surfaceHolder.setFormat(PixelFormat.TRANSLUCENT); //        surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
SurfaceView 闪屏问题
问题: 在xml加入SurfaceView 或者 addView 添加SurfaceView 会出现闪屏. 解决办法 在对应的Activity中添加 getWindow().setFormat(PixelFormat.TRANSLUCENT);
使用SurfaceView实现飘赞动画
最近做直播项目,需要实现点赞动画,一提起动画就想到了使用View的属性动画,后来想了一下,那么多用户点赞,会导致屏幕上出现很多View,开销太大,一定会很卡,所以看主流主播软件用什么方案解决的。 于是反编译了映客apk,大概看了一下,它的点赞只用了一个SurfaceView,每个心都是实时画到画布上去的,这样效率确实很高,再多的心也不怕了。思路有了,但是自己从头到尾写毕竟麻烦,后来上网查
Android 笔记 surfaceView textureView
SurfaceViewAndroid有一个组件叫SurfaceView,是一个单独的组件,但是并不是和其他常见组件一样提供特别的功能(比如图片浏览,输入字符等等),就是一个空组件。那么这个有什么用呢。一般情况下,系统开始的时候会创建一个主线程,称之为UI线程,简单任务可以直接在这个线程里面完成,一些复杂任务,比如网络读取等等,在主线程允许的话,系统会报错,说,这类任务不能在主线程完成。所以,一些比较
Android显示系统之View与SurfaceView更新屏幕的区别.对于View.则是在UI主线程中更新画面.SurfaceView更新屏幕,是在非UI线程(主线程)中实现SurfaceHolde
Android显示系统之View与SurfaceView更新屏幕的区别 1、View View extends Object implements Drawable.Callback KeyEvent.Callback AccessibilityEventSource java.lang.Object    ↳ androi
Android中几种常用的定时器和延时方法
通过实际项目的练习,掌握了几种android基本定时器和延时的用法,这里我想总结一下作为自己的收获,下面列出的是比较简洁的模式,方便简单地在程序中直接调用。 一、三种常用的定时器 1.Handler类的postDelayed方法: Handler mHandler = new Handler(); Runnable r = new Runnabl
Android解决surfaceView中底图闪烁的问题。
实现原理:当我们在画布上面画了一遍的时候,由于surfaceView画布相当于有两个,两块画布交替出现,所以我们再来一次,重新获得画布,然后画上同样的内容,这样两块画布上面就有了相同的内容了。  这时候我们再重新锁一次,"持久化"上次所绘制的内容。就会避免闪烁的现象。
surfaceview播放视频截图黑屏
不多说,直接上码!(原理是把视频去帧,保存到画布,然后把当前屏幕截图,然后再画到画布上)     @SuppressLint("NewApi")     private void savaScreenShot() {         // 构建Bitmap                 WindowManager windowManager = getWindowManager();
android SurfaceView黑屏问题
说一个真实的案例。其中需求要做一个