Скручивание страницы Android по харизму, добавление вызванного TextView и исключения: - PullRequest
0 голосов
/ 08 февраля 2012

Мне нужно отредактировать проект harism о page_curl https://github.com/harism/android_page_curl со следующим требованием: мне нужно добавить TextView ниже Curl_View (когда страница переворачивается, содержимое textView изменяется).Я сделал Интерфейс, который предоставляет TextView с данными

public interface TextProvider{
        public int getTextCount();
        public void setText(int index);

        public String getText(int index);

        public TextView getTextView();
    }

, и единственное место для обновления TextView, когда страницы свернуты, находится в методе onDrawFrame ()

, но у меня есть следующееисключение: android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться его представлений.

В некоторых решениях говорится, что я должен использовать обработчик, Мой вопрос, как использовать обработчик в этом случае?

1 Ответ

0 голосов
/ 27 марта 2012

Я попробовал это, и это сработало: закрытый класс BitmapProvider реализует CurlView.BitmapProvider {

    private int[] mBitmapIds = {};


    public void setImageList( int[] value )
    {
        mBitmapIds = value;
    }


    public BitmapDrawable writeOnDrawable( int drawableId, String text, int x, int y, int width )
    {

        Bitmap bitmap = BitmapFactory.decodeResource( getResources(), drawableId ).copy( Bitmap.Config.ARGB_8888, true );

        Bitmap newBitmap = Bitmap.createBitmap( bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888 );
        Canvas canvas = new Canvas( newBitmap );
        canvas.drawBitmap( bitmap, new Matrix(), null);

        if( text != "" ){
            TextView tv = new TextView( getApplicationContext() );
            tv.setText( text );
            tv.setTextColor( 0xa00050ff );
            tv.setTextSize( 24 );
            tv.setTypeface( typeface );

            Bitmap txtBitmap = Bitmap.createBitmap( width, 768, Bitmap.Config.ARGB_8888 );

            Canvas c = new Canvas( txtBitmap );
            tv.layout( 0, 0, width, 300 );
            tv.draw( c );

            canvas.drawBitmap( txtBitmap, x, y, null );
        }


        return new BitmapDrawable( newBitmap );
    }

    //@Override
    public Bitmap getBitmap( int width, int height, int index ) 
    {
        BitmapDrawable drawable;
        Page currentPage = getCurrentPage( index );

        if( currentPage.getText() != null ){
            drawable = writeOnDrawable( mBitmapIds[ index ] , currentPage.getText(), currentPage.getTextFieldX(), currentPage.getTextFieldY(), currentPage.getTextFieldWidth() );
        } else {
            drawable = writeOnDrawable( mBitmapIds[ index ] , "", currentPage.getTextFieldX(), currentPage.getTextFieldY(), currentPage.getTextFieldWidth() );
        }

        Bitmap bitmap = drawable.getBitmap();

        return bitmap;  

    }

    //@Override
    public int getBitmapCount() {
        return mBitmapIds.length;
    }
}
...