как заставить недействительным ()? - PullRequest
0 голосов
/ 24 июня 2011

У меня есть следующие классы, которые составляют мое приложение, которое помещает искажение «рыбий глаз» в растровое изображение.когда я загружаю растровое изображение, оно отображается ТОЛЬКО, когда я касаюсь экрана или ползунка, и не отображает растровое изображение после завершения конструктора представления.я поставил туда несколько входов, и в основном вызывается 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();


    }




}

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Растровое изображение bgr2 создано в конструкторе, но ничего не нарисовано в нем. Он будет нарисован из findCirclePixels, который вызывается при смене слайдера.

Я думаю, createBitmap (int width, int height, Bitmap.Config config) использует только конфигурацию, вы можете использовать другой вариант создания растрового изображения, может быть

Bitmap createBitmap (Bitmap source, int x, int y, int width, int height)
1 голос
/ 24 июня 2011

Вызов invalidate () в onAttachedToWindow () может быть?

...