lockcanvas-一个关于android surfaceView的问题,求大神回答

问题描述

一个关于android surfaceView的问题,求大神回答

surfaceView据说双缓存,两画布换来换去,但是我post后画布有时候还有有时候就没了
surfaceCreated方法里,最后的
canvas=sfh.lockCanvas();
sfh.unlockCanvasAndPost(canvas);
多加几个少加几个出现不同的情况,这个是怎么回事,大神求帮忙TT

下面是代码 clock.java

 package com.app.jtj.clock;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.text.format.Time;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * Created by Administrator on 2015/11/18.
 */
public class Clock extends SurfaceView implements SurfaceHolder.Callback,Runnable{

    private int w,h=0;
    private int mCP=0;
    private int xxxR=0;
    private int xxR=0;
    private int xR=0;
    private int R=0;
    private int mR=0;
    private float du=0;
    private Time t=new Time();
    private Time tP=new Time();

    private SurfaceHolder sfh;
    private Paint paint;
    private Canvas canvas;
    private boolean flag=true;
    private Thread th;

    public Clock(Context context) {
        super(context);
        sfh = this.getHolder();
        sfh.addCallback(this);
    }

    private void init() {
        mCP= (int) (w * 0.5);
        xxxR = (int) ( w * 0.93 * 0.5);
        xxR = (int) ( w * 0.90 * 0.5);
        xR = (int) ( w * 0.85 * 0.5);
        R = (int) ( w * 0.80 * 0.5);
        mR = (int) ( w * 0.75 * 0.5);
    }

    private void initView() {
        //canvas.drawColor(Color.WHITE);

        //画圆
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(5);
        paint.setARGB(255, 150, 150, 150);
        canvas.drawCircle(mCP, mCP, xR, paint);

        paint.setStrokeWidth(1);
        paint.setARGB(255, 150, 150, 150);
        canvas.drawCircle(mCP, mCP, R, paint);

        //刻度
        paint.setStrokeWidth(10);
        for (int i=0;i<12;i++){
            canvas.drawLine(mCP,mCP-xR,mCP,mCP-xxR,paint);
            canvas.rotate(30,mCP,mCP);
        }

        paint.setStrokeWidth(10);
        paint.setARGB(255, 20, 20, 20);
        for (int i=0;i<4;i++){
            canvas.drawLine(mCP,mCP-xR,mCP,mCP-xxxR,paint);
            canvas.rotate(90,mCP,mCP);
        }

        //日期时间
        tP.setToNow();
        t.setToNow();
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setTextSize((float) (w * 0.05));
        paint.setStrokeWidth(1);
        int month=tP.month+1;
        String str1=tP.year + "."+month+"."+tP.monthDay;
        float numb1=paint.measureText(str1);
        canvas.drawText(str1, mCP-numb1/2, (float) (w*0.30), paint);
        str1=getWeek(tP);
        numb1=paint.measureText(str1);
        canvas.drawText(str1, mCP-numb1/2, (float) (w*0.70), paint);

    }

    private String getWeek(Time t) {
        String str2="";
        switch (t.weekDay){
            case 0:str2="星期日";break;
            case 1:str2="星期一";break;
            case 2:str2="星期二";break;
            case 3:str2="星期三";break;
            case 4:str2="星期四";break;
            case 5:str2="星期五";break;
            case 6:str2="星期六";break;
        }
        return str2;
    }

    @Override
    public void run() {

        }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        w=this.getWidth();
        h = this.getHeight();
        flag=true;
        paint =new Paint();
        paint.setColor(Color.WHITE);
        paint.setAntiAlias(true);

        for (int i=0;i<2;){
            canvas=sfh.lockCanvas(new Rect(0,0,w,h));
            if (canvas!=null){
                i++;
                canvas.drawColor(Color.WHITE);
                sfh.unlockCanvasAndPost(canvas);
            }
        }

        for (int i=0;i<2;) {
            canvas = sfh.lockCanvas();
            if (canvas!=null) {
                init();
                Log.i("ttt", "1");
                initView();

                i++;
                sfh.unlockCanvasAndPost(canvas);
            }
        }
        canvas=sfh.lockCanvas();
        sfh.unlockCanvasAndPost(canvas);
        canvas=sfh.lockCanvas();
        sfh.unlockCanvasAndPost(canvas);
        canvas=sfh.lockCanvas();
        sfh.unlockCanvasAndPost(canvas);
        canvas=sfh.lockCanvas();
        sfh.unlockCanvasAndPost(canvas);

        //th = new Thread(this);
        //th.start();
    }

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

    }

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

}

activity里就加了
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new Clock(this));

解决方案

无报错,log.i,"ttt"有打印,也就是方法有执行

时间: 2024-09-10 10:09:42

lockcanvas-一个关于android surfaceView的问题,求大神回答的相关文章

android获取公网IP 求大神解答

问题描述 android获取公网IP 求大神解答 android可以获取公网IP吗 不是局域网和内网IP 不是那种获取URL的方式 解决方案 需要借助一个外网的服务器,比如常见的用ip138.cmyiphttp://blog.csdn.net/jaycee110905/article/details/8516318 解决方案二: http://www.cnblogs.com/android100/p/Android-get-ip.htmlhttp://www.2cto.com/kf/201504

cocos2d-x-3.8编译android报错,求大神帮帮忙

问题描述 cocos2d-x-3.8编译android报错,求大神帮帮忙 创建了一个cocos2d项目,添加了几行代码,在vs2012下运行正常,编译win32也正常,但是一编译android就报错 NDK用android-ndk-r9d和android-ndk-r10两个版本试过,估计不是ndk的原因,其他的原因也想不出来,求大神帮忙解决 这是报错的原文 E:cocosfu100>cocos compile -p android -j 4 执行命令:compile 编译模式:debug 使用

android studio的问题求大神解决!!!

问题描述 android studio的问题求大神解决!!! android studio 自己创建的项目就可以运行,但是导入的项目不能运行怎么解决啊?其他的导入方式也试过了,导入的项目上面的运行跟模拟器都是灰色的,而且项目里面每一个文件(布局文件除外)的右下角都会有一个红色的圆圈,圆圈里面是一红色的J字母. 解决方案 重新把项目构建一边,在 解决方案二: 小伙子 ,你按这篇帖子重新导入你的Eclipse项目.http://www.cnblogs.com/ct2011/p/4183553.htm

服务端-android方面问题,求大神解答

问题描述 android方面问题,求大神解答 我想做一个吧手机照片传到服务器上的小程序,求大神告诉客户端和服务端怎么写?服务器是用tomcat做. 解决方案 就是上传图片http://www.cnblogs.com/gzggyy/archive/2011/08/02/2125237.html

android游戏-Android运行报错 求大神指导

问题描述 Android运行报错 求大神指导 12-01 20:49:04.872: D/AndroidRuntime(2097): Shutting down VM 12-01 20:49:04.872: W/dalvikvm(2097): threadid=1: thread exiting with uncaught exception (group=0xb4addb90) 12-01 20:49:04.922: E/AndroidRuntime(2097): FATAL EXCEPTIO

使用Template模板生成了脚本后怎么把这个脚本的内容写入到一个txt文件中呢?求大神解答

问题描述 使用Template模板生成了脚本后怎么把这个脚本的内容写入到一个txt文件中呢?求大神解答 public static void main(String[] args) throws Exception { Map map = new HashMap(); Configuration cfg = new Configuration(); Template t = cfg.getTemplate("src/main/webapp/model/sqoop_header.ftl"

代码-做一个贴吧评价功能,求大神指导啊。

问题描述 做一个贴吧评价功能,求大神指导啊. 做一个贴吧评价功能,简单的评价功能,小弟不才,求大神指导,这个代码怎么敲!

linux-Linux下安装Android Studio出错,求大神解答!

问题描述 Linux下安装Android Studio出错,求大神解答! JDK都配置好了,运行 zoegreen@zoegreen-Lenovo-IdeaPad-Y470:/opt/android-studio/bin$ java -version java version "1.7.0_51" Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) Server VM (build 24.51-b0

android studio-Linux下安装Android Studio出错,求大神解答!

问题描述 Linux下安装Android Studio出错,求大神解答! JDK都配置好了,运行 zoegreen@zoegreen-Lenovo-IdeaPad-Y470:/opt/android-studio/bin$ java -version java version "1.7.0_51" Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) Server VM (build 24.51-b0