簡體   English   中英

無縫背景作為自定義視圖組件,invalidate()不會調用onDraw

[英]Seamless background as custom view component , onDraw is not get called by invalidate()

朋友們,

我想將無縫背景作為自定義視圖組件。

我在調試過程中發現的問題,

第一次在線程中調用invalidate()時,將調用onDraw回調方法。 其他時候我的線程正在調用invalidate(),則不會調用onDraw回調方法。

因此它只是在invalidate()方法上運行,就像它根本不存在一樣。

該應用程序顯示Seamlessbackgroundpng。 但是作為靜態。 它不會被更新。

我發布所有代碼,因為該錯誤可能在線程之外,invalidate()所在的位置或在onDraw方法之外。

感謝任何幫助! 所以THX

              public class MyBringBackSurface extends View implements Runnable {

Bitmap bitmapResource;
int leftFrameX, rightFrameX, startX, stopX, bitmapPixelWidth,
        bitmapPixelHight;
int pixelPerFrame = 10;
int framerate = 100;
int threadSleepTime;
int offsetYInPixel = 200;
Thread ourthread = null;
boolean isrunning = false;

Canvas c;

public MyBringBackSurface(Context context) {
    super(context);

    init();

}

public MyBringBackSurface(Context context, AttributeSet attrs) {
    super(context, attrs);

    init();

}

public MyBringBackSurface(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    init();

}

private void init() {


    // Set up Bitmap Resource

    bitmapResource = BitmapFactory.decodeResource(getResources(),
                    R.drawable.simelessbackground);


 //  c = new Canvas(bitmapResource);


    // Implementing leftFrameX and rightFrameX
    leftFrameX = 0;
    rightFrameX = bitmapResource.getWidth();

    // Calculating the Thread sleep time
    threadSleepTime = 1000 / framerate;



}

public void pause() { // destroy the currently running thread because
                        // anyways in the on resume will be created a
                        // new one again

    isrunning = false;
    while (true) {

        try { // goes through this thread until our thread died
            ourthread.join(); // Blocks the current Thread
                                // (Thread.currentThread()) until the
                                // receiver finishes its execution and
                                // dies.
        } catch (InterruptedException e) {

            e.printStackTrace();
        }
        break;
    }


}

public void resume() {

    isrunning = true;
    ourthread = new Thread(this);

    ourthread.start();

}

public void run() {

    while (isrunning) {

        try {
            Thread.sleep(threadSleepTime);
            // formula is 1000/ sleep time (here 5) = frame rate
        } catch (InterruptedException e) {

            e.printStackTrace();
        }

        invalidate();

        // Add pixelPerFrame and draw again
        leftFrameX = leftFrameX - pixelPerFrame;
        rightFrameX = rightFrameX - pixelPerFrame;

        // if picture is completely out of the screen, start over again
        if (leftFrameX <= -bitmapResource.getWidth()) {
            leftFrameX = 0;
            rightFrameX = bitmapResource.getWidth();
        }
    }
}

/**
 * Render the text
 * 
 * @see android.view.View#onDraw(android.graphics.Canvas)
 */
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);


    canvas.drawRGB(255, 255, 255);

    // Draw Rectangle 1250 pixel
    Rect rect1000 = new Rect();
    rect1000.set(0, 0, 1250, 20);
    Paint blue = new Paint();
    blue.setColor(Color.BLUE);
    canvas.drawRect(rect1000, blue);

    // Draw first Bitmap
    Rect rectBitmapSource = new Rect(0, 0, bitmapResource.getWidth(),
            bitmapResource.getHeight());
    Rect rectBitmapDestinationFirst = new Rect(leftFrameX, offsetYInPixel,
            rightFrameX, offsetYInPixel + bitmapResource.getHeight());
    canvas.drawBitmap(bitmapResource, rectBitmapSource,
            rectBitmapDestinationFirst, null);

    // Draw second Bitmap

    Rect rectBitmapDestinationSecond = new Rect(
            (leftFrameX + bitmapResource.getWidth()), offsetYInPixel,
            (rightFrameX + bitmapResource.getWidth()), offsetYInPixel
                    + bitmapResource.getHeight());
    canvas.drawBitmap(bitmapResource, rectBitmapSource,
            rectBitmapDestinationSecond, null);



}

}

經過googledocs之后,我想出了答案。

如果要從UI線程外部使視圖無效,則必須使用postinvalidate()命令而不是invalidate()。

而已。 它將像魅力一樣工作!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM