onfocuschanged永远不会被调用for surfaceview(android)

时间:2015-11-17 15:16:14

标签: android surfaceview

在我的Android应用程序中,我有包含surfaceview的活动。我想在表面视图/活动对用户可见时启动surfaceview线程。我试过在OnSurfaceCreated中启动线程。这可行,但在一些手机(三星)活动需要很多秒才能看到。当我恢复活动时,屏幕变黑。所以我用谷歌搜索,发现当一个视图变得可见onFocusChanged被调用。我尝试在surfaceview中实现OnFocusChanged,但它永远不会被调用。下面是我的表面视图课程。

 public class ImageSurface extends SurfaceView implements SurfaceHolder.Callback {

    private DrawThread drawThread;
    private SurfaceHolder sHolder;
    private ImageHolder imageHolder;
    Bitmap mybit;
    Bitmap orgiBitmap;// ;)
    int message;
    Context context;
    private String valMagField;

        public ImageSurface(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.context=context;
            SurfaceHolder holder = getHolder();
            holder.addCallback(this);
            setFocusable(true);
            clearFocus();
            drawThread = new DrawThread(context);

        }

        public void setImageHolder(ImageHolder imageHolder){
            this.imageHolder = imageHolder;
        }

        public void setBitmap(String filePath){

        }
        public void resume(){
            drawThread.resumeThread();

        }

        @Override
        public void onFocusChanged(boolean focus,int direction,Rect rect){
            super.onFocusChanged(focus, direction, rect);
            Log.d("in focus changed","onfocuschanged"+System.currentTimeMillis());

        }


        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            drawThread.setSurfaceSize(width, height);

            resume();

        }
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            long startTime, stopTime;
            startTime = System.currentTimeMillis();
            sHolder = holder;
            drawThread.setRunning(true);


            if(drawThread.getState()==Thread.State.NEW){
                    drawThread.start();

            }
            if(drawThread.getState()==Thread.State.TERMINATED){
                drawThread = new DrawThread(context);
                drawThread.setRunning(true);
                drawThread.start();
            }
    }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            drawThread.pauseThread();
        }

        class DrawThread extends Thread{
            int value=0;
            private Boolean drun;

            int valSize =30;
            Context context;
            private int sHeight , sWidth;
            int lastmessage;
            boolean threadPaused= false;

            public DrawThread(Context context){
                drun = false;
                this.context = context;
        }

            public void pauseThread(){
                synchronized(this){
                    threadPaused = true;
                    this.notify();
                }
            }

            public void resumeThread(){
                synchronized(this){
                    threadPaused = false;
                    this.notify();
                }
            }



            public void setRunning(Boolean run){
                drun = run;
            }

            public boolean isRunning(){
                return drun;
            }

            public void setSurfaceSize(int width , int height){
                sWidth = width;
                sHeight = height;

            }

            @Override
            public void run(){

                while(drun){
                    Canvas c = null;
                    //Log.d("yes","thread is running");
                    try{
                        synchronized(this){
                            if(threadPaused)
                            try {
                                this.wait();
                            } catch (InterruptedException e) {

                                Log.d("in wait of surface view thread","error"+e.toString());
                            }
                        }

                        c = sHolder.lockCanvas(null);
                        synchronized(sHolder){
                            updateCanvas(c);
                        }
                    }finally {
                        if(c!=null){
                            sHolder.unlockCanvasAndPost(c);
                        }
                    }
                }
            }

            private void updateCanvas(Canvas canvas){
                try{
                    if(imageHolder.dispBit!= null){
                        int x=(sWidth-imageHolder.dispBit.getWidth())/2,y=(sHeight-imageHolder.dispBit.getHeight())/2;
                        imageHolder.applyEffects(); 
                    if(canvas!=null)
                        canvas.drawBitmap(imageHolder.dispBit, x,y,null);
    }
                    else if(imageHolder!=null)
                       imageHolder.setDisplaySize(sWidth, sHeight);

                }catch(Exception e){
                    e.printStackTrace();
                }

             }

        }
  }

0 个答案:

没有答案