java - 如何强制invalidate()?

标签 java android image-processing bitmap

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

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();


    }




}

最佳答案

位图 bgr2 在构造函数中创建,但其中没有绘制。它将通过 findCirclePixels 进行绘制,在 slider 更改时调用该函数。

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

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

关于java - 如何强制invalidate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6471570/

相关文章:

PHP 错误 一次插入导致两行 ANDROID

javascript - 希望在 Javascript/WebGL 中访问 16 位图像数据

c++ - 编译时 SIFT 代码 (C++) 中的 undefined reference

java - 防止 ConcurrentLinkedQueue<T> 出现内存不足异常

java - 使用 ANT 签署 Android 应用程序

java - 可以将 CA(客户端)颁发的证书与自签名证书(服务器)通信吗?

android - 我对 pdftron 集成有疑问

java - 我的 Android 应用程序如何检测 IP 地址范围

c# - 在 UWP App 中将蒙版应用于位图图像

java - WildFly:启动时出错