如何强制invalidate()?

发布于 2024-11-17 13:18:48 字数 5081 浏览 2 评论 0原文

我有以下类组成了我的应用程序,该应用程序在位图上放置了鱼眼失真。当我加载位图时,它仅在触摸屏幕或滑动条时显示,并且在视图的构造函数完成后不显示位图。我在那里进行了一些日志记录,基本上调用了 ondraw() 但没有任何内容绘制到画布上。如何让应用程序在视图构造函数完成后立即失效?

public class TouchView extends View{

    private File tempFile;
    private byte[] imageArray;
    private Bitmap bgr;
    private Bitmap bm;
    private Bitmap bgr2 = null;;
    private Paint pTouch;
    private float centreX = 1;
    private float centreY = 1;
    private int radius = 50;
    private int Progress = 1;
    private static final String TAG = "*********TouchView";
    private Filters f = null;
    private boolean AsyncRunning = false;
   // private MyTask mt = null;



    public TouchView(Context context) {
        super(context);
       // TouchView(context, null);
    }




    public TouchView(Context context, AttributeSet attr) {
        super(context,attr);
        Log.e(TAG, "++++++++++ inside touchview constructor");



        tempFile = new File(Environment.getExternalStorageDirectory().
                getAbsolutePath() + "/"+"image.jpg");

        imageArray = new byte[(int)tempFile.length()];


     try{

            InputStream is = new FileInputStream(tempFile);
            BufferedInputStream bis = new BufferedInputStream(is);
            DataInputStream dis = new DataInputStream(bis);


            int i = 0;

            while (dis.available() > 0) {
            imageArray[i] = dis.readByte();
            i++;
            }

            dis.close();

       } catch (Exception e) {

               e.printStackTrace();
            }



        BitmapFactory.Options bfo = new BitmapFactory.Options();
        bfo.inSampleSize = 1;

        bm = BitmapFactory.decodeByteArray(imageArray, 0, imageArray.length, bfo);


        bgr = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
        bgr = bm.copy(bm.getConfig(), true);
        bgr2 = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());



        f = new Filters();


        pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);         
        pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT)); 
        pTouch.setColor(Color.TRANSPARENT);
        pTouch.setStyle(Paint.Style.STROKE);

        Log.e(TAG, "++++++++++ end od touchview constructor");
    }// end of touchView constructor


    public void findCirclePixels(){ 

        Log.e(TAG, "++++++++++ inside fpc");
              new Thread(new Runnable() {
                public void run() {
                    float prog = (float)Progress/150000;

                final Bitmap bgr3 = f.barrel(bgr,prog,centreX,centreY);
                  TouchView.this.post(new Runnable() {
                    public void run() {
                      TouchView.this.bgr2 = bgr3;
                      TouchView.this.invalidate();
                    }
                  });
                }
              }).start();


        /*
        float prog = (float)Progress/150000;
        long startTime = System.currentTimeMillis();
        bgr2 = f.barrel(bgr,prog);
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;
        Log.e(TAG, "++++++++++ barrel() took "+ duration+" ms");
        */

              Log.e(TAG, "++++++++++ end fpc");
        }// end of changePixel()




    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {

            case MotionEvent.ACTION_DOWN: {

                centreX = (int) ev.getX();
                centreY = (int) ev.getY();
                //findCirclePixels();
                TouchView.this.invalidate();

                break;
            }

            case MotionEvent.ACTION_MOVE: {

                    centreX = (int) ev.getX();
                    centreY = (int) ev.getY();
                  //  findCirclePixels();
                  TouchView.this.invalidate();
                    break;

            }           

            case MotionEvent.ACTION_UP: 

                break;

        }
        return true;
    }//end of onTouchEvent





    public void initSlider(final HorizontalSlider slider)
    {
        Log.e(TAG, "******setting up slider*********** ");
        slider.setOnProgressChangeListener(changeListener);

    }



    private OnProgressChangeListener changeListener = new OnProgressChangeListener() {


        @Override
        public void onProgressChanged(View v, int progress) {
            // TODO Auto-generated method stub


              setProgress(progress);
            //TouchView.this.Progress = progress;


        }
    };




    @Override
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);

        Log.e(TAG, "++++++++++ inside ondraw");
        canvas.drawBitmap(bgr2, 0, 0, null);
       // canvas.drawCircle(centreX, centreY, radius,pTouch);

        Log.e(TAG, "++++++++++end ondraw");

    }//end of onDraw




    protected void setProgress(int progress2) {
        Log.e(TAG, "***********in SETPROGRESS");
        this.Progress = progress2;



        findCirclePixels();
        invalidate();


    }




}

i've got the following classes that make up my app that places a fisheye distortion on a bitmap. when i load the bitmap it ONLY displays when i touch the screen or slidebar and doesn't display the bitmap after the view's constructor has completed. i've put some logging in there and basically the ondraw() is called but nothing is drawn to the canvas. How can i get the app to invalidate straight after the view constructor completes?

public class TouchView extends View{

    private File tempFile;
    private byte[] imageArray;
    private Bitmap bgr;
    private Bitmap bm;
    private Bitmap bgr2 = null;;
    private Paint pTouch;
    private float centreX = 1;
    private float centreY = 1;
    private int radius = 50;
    private int Progress = 1;
    private static final String TAG = "*********TouchView";
    private Filters f = null;
    private boolean AsyncRunning = false;
   // private MyTask mt = null;



    public TouchView(Context context) {
        super(context);
       // TouchView(context, null);
    }




    public TouchView(Context context, AttributeSet attr) {
        super(context,attr);
        Log.e(TAG, "++++++++++ inside touchview constructor");



        tempFile = new File(Environment.getExternalStorageDirectory().
                getAbsolutePath() + "/"+"image.jpg");

        imageArray = new byte[(int)tempFile.length()];


     try{

            InputStream is = new FileInputStream(tempFile);
            BufferedInputStream bis = new BufferedInputStream(is);
            DataInputStream dis = new DataInputStream(bis);


            int i = 0;

            while (dis.available() > 0) {
            imageArray[i] = dis.readByte();
            i++;
            }

            dis.close();

       } catch (Exception e) {

               e.printStackTrace();
            }



        BitmapFactory.Options bfo = new BitmapFactory.Options();
        bfo.inSampleSize = 1;

        bm = BitmapFactory.decodeByteArray(imageArray, 0, imageArray.length, bfo);


        bgr = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
        bgr = bm.copy(bm.getConfig(), true);
        bgr2 = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());



        f = new Filters();


        pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);         
        pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT)); 
        pTouch.setColor(Color.TRANSPARENT);
        pTouch.setStyle(Paint.Style.STROKE);

        Log.e(TAG, "++++++++++ end od touchview constructor");
    }// end of touchView constructor


    public void findCirclePixels(){ 

        Log.e(TAG, "++++++++++ inside fpc");
              new Thread(new Runnable() {
                public void run() {
                    float prog = (float)Progress/150000;

                final Bitmap bgr3 = f.barrel(bgr,prog,centreX,centreY);
                  TouchView.this.post(new Runnable() {
                    public void run() {
                      TouchView.this.bgr2 = bgr3;
                      TouchView.this.invalidate();
                    }
                  });
                }
              }).start();


        /*
        float prog = (float)Progress/150000;
        long startTime = System.currentTimeMillis();
        bgr2 = f.barrel(bgr,prog);
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;
        Log.e(TAG, "++++++++++ barrel() took "+ duration+" ms");
        */

              Log.e(TAG, "++++++++++ end fpc");
        }// end of changePixel()




    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        switch (ev.getAction()) {

            case MotionEvent.ACTION_DOWN: {

                centreX = (int) ev.getX();
                centreY = (int) ev.getY();
                //findCirclePixels();
                TouchView.this.invalidate();

                break;
            }

            case MotionEvent.ACTION_MOVE: {

                    centreX = (int) ev.getX();
                    centreY = (int) ev.getY();
                  //  findCirclePixels();
                  TouchView.this.invalidate();
                    break;

            }           

            case MotionEvent.ACTION_UP: 

                break;

        }
        return true;
    }//end of onTouchEvent





    public void initSlider(final HorizontalSlider slider)
    {
        Log.e(TAG, "******setting up slider*********** ");
        slider.setOnProgressChangeListener(changeListener);

    }



    private OnProgressChangeListener changeListener = new OnProgressChangeListener() {


        @Override
        public void onProgressChanged(View v, int progress) {
            // TODO Auto-generated method stub


              setProgress(progress);
            //TouchView.this.Progress = progress;


        }
    };




    @Override
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);

        Log.e(TAG, "++++++++++ inside ondraw");
        canvas.drawBitmap(bgr2, 0, 0, null);
       // canvas.drawCircle(centreX, centreY, radius,pTouch);

        Log.e(TAG, "++++++++++end ondraw");

    }//end of onDraw




    protected void setProgress(int progress2) {
        Log.e(TAG, "***********in SETPROGRESS");
        this.Progress = progress2;



        findCirclePixels();
        invalidate();


    }




}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

丶视觉 2024-11-24 13:18:48

位图 bgr2 在构造函数中创建,但其中没有绘制任何内容。它将从 findCirclePixels 中绘制,该函数在滑块更改时被调用。

我认为 createBitmap (int width, int height, Bitmap.Config config) 只使用配置,您可以使用其他变体创建位图可能是

Bitmap createBitmap (Bitmap source, int x, int y, int width, int height)

Bitmap bgr2 is created in constructor but nothing is painted in it. It will get painted from findCirclePixels which gets called on slider change.

I think createBitmap (int width, int height, Bitmap.Config config) only uses config, you can use other variant create bitmap may be

Bitmap createBitmap (Bitmap source, int x, int y, int width, int height)
花桑 2024-11-24 13:18:48

也许在 onAttachedToWindow() 中调用 invalidate() ?

Calling invalidate() in onAttachedToWindow() maybe?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文