» »

Android zamenjava pogledov

Android zamenjava pogledov

g333kk ::

Lp,
Želim namesto Bitmap pp= Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true); uprabit tako da bi spremenil le matrix in nič dugega,( kar pa pomeni da bi sliko samo obrnil, brez createBitmap,) ker trenutno mi onemogoča nadaljno risanje, tak sistem ... R
public static Bitmap flip(Bitmap src, int type) {

    // create new matrix for transformation

    Matrix matrix = new Matrix();

    // if vertical

    if(type == FLIP_VERTICAL) {

        // y = y * -1

        matrix.preScale(1.0f, -1.0f);

    }


    // if horizonal

    else if(type == FLIP_HORIZONTAL) {

        // x = x * -1

       matrix.preScale(-1.0f, 1.0f);

    // unknown type

    } else {

        return null;

    }

    // return transformed image
   //Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);
  Bitmap pp= Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);

  return pp;

}


Drugo vprašanje: Zakaj mi verzija dela na nekaterih telefonih na drugih ne,. In kako se zadeva naredi prilagodljiva vsem verzijam oz vsaj večini
  • spremenilo: g333kk ()

c00L3r ::

Ne vem, če gre sliko obrnit brez nove instance Bitmap. Imam sam en app, ki dela nekaj z manupulacijo/generiranjem slik. Jaz sicer v onDraw metodi operiram s sliko in jo rotiram z:
Matrix matrix = new Matrix();
matrix.postRotate(rotateAngle);


Drugo vprašanje: Zakaj mi verzija dela na nekaterih telefonih na drugih ne.

Boš moral bit malo bolj specifičen. Kaj pomeni ne dela? Ni slike, je napačna slika, je crash? Če je crash, kaj pravi stack trace?

Aja, še en nastvet. Ko bitmap objekta več ne potrebuješ, uporabi metodo recycle na njem, da poveš VM, da se lahko ta pomnilnik sprosti.

g333kk ::

Ni crash, dogaja se nekako takole:
Rišem po zaslonu, vendar se mi ne prikaže, potem pa kliknem save in tam shrani, kar sem narisal vse normalno, samo ne izrisuje, na zaslon. (Črte ki jih narišem)
Hja jaz objekte skos potrebujem saj morajo bit skos izrisani, na zaslonu ..

c00L3r ::

Predvidevam da override-aš onDraw() metodo v svojem razredu dedovanem iz View? Ali rišeš kako drugače? Da prožiš onDraw() moraš poklicat .invalidate() nad svojim view-em. Ko se onDraw() zaključi ostanejo stvari še vedno narisane, dokler se spet ne kliče onDraw in "prepleska", kar je bilo prej narisano.

Ne rabiš pa vsakič na novo tvorit vseh objektov. Bitmap imaš lahko npr. shranjen kot spremenljivko v objektu. Kratek psevdokod:
class mojView extends View{
	Bitmap mojaSlika = null;
	
	public void onDraw(Canvas canvas){
		if (mojaSlika == null){
			mojaSlika = naloziSliko(); --primer pomozne metode za nalaganje slike
		}
		canvas.drawBitmap(...);
	}

}

g333kk ::

Praktično imam tri draw metode:
- na tmpBitmap rišem začasno
- na mBitmap ko končam na tmpBitmap
- potem pa še nekega za undo ki mi shranjuje zapise..
Nekako takole zgleda moja koda:
Android paint: imam samo za gumbe in spinnerje..
Draw handler:
- vse oblike ki jih izrisujem,
- in handletouchEvent:
  public void handleTouchEvent(MotionEvent event) {
               
                Point point = new Point(event.getX(), event.getY());
               
                if(SELECTED_SHAPE == SHAPES.ERASE)
                {   mCurrentPaint = mErasePaint;
               
                }
                else
                        mCurrentPaint = mPaint;
               
                switch(event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                        mDownPoint = point;
                        break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_MOVE:
                        setCurrentShape(SELECTED_SHAPE, point);
                        if(mOnDrawListener != null) {
                                if(event.getAction() == MotionEvent.ACTION_MOVE) {
                                        mOnDrawListener.onDrawShapeTemp(mCurrentShape, mCurrentPaint);
                                } else {
                                        mOnDrawListener.onDrawShape(mCurrentShape, mCurrentPaint);
                                }
                                
                        }
                       
                        break;
               
                }
                if(event.getAction() == MotionEvent.ACTION_UP) {
                        GRAPHICOBJECTS.add(mCurrentShape.getPath());
                        mCurrentShape = null;
                }
               
        }



Panel:


        private void updateEraseColor(int color) {

                mDrawHandler.setEraseColor(color);
        }
       
        private void prepareBitmaps() {
       	
        		
        	
        int a=255;
       	int r=255;
       	 int g=255;
            int b=255;
         
                if (mBitmap == null) {
                  	   
                        tCanvas = getHolder().lockCanvas();
                        mBitmap = Bitmap.createBitmap(350, 350, Bitmap.Config.ARGB_8888);
                        mCanvas = new Canvas(mBitmap);
                        tmpBitmap = Bitmap.createBitmap(350,350, Bitmap.Config.ARGB_8888);
                        tmpCanvas = new Canvas(tmpBitmap);
                //tCanvas.getWidth(), tCanvas.getHeight()
                    //   tmpCanvas.drawColor(farba);
                      tmpCanvas.drawARGB(a,r,g,b);
                        mCanvas.drawARGB(a, r, g, b);
                      // mCanvas.drawColor(farba);
                        getHolder().unlockCanvasAndPost(tCanvas);
                        tCanvas = null;
                        
                }
        }
 
        public DrawHandler getPainterHandler() {
                return mDrawHandler;
        }
        

 
        @Override
        public boolean onTouchEvent(MotionEvent event) {
                mDrawHandler.handleTouchEvent(event);
                return true;
        }
 
        public void drawBitmap(Bitmap btp) {
                tCanvas = getHolder().lockCanvas();
                tCanvas.drawBitmap(btp, 0, 0, null);
                getHolder().unlockCanvasAndPost(tCanvas);
                tCanvas = null;
        }
 
       
       
        private void updateBitmap(Canvas canvas, Bitmap bitmap, Shape shape, Paint paint) {
                synchronized (bitmap) {
                
                        canvas.drawPath(shape.getPath(), paint);
                        drawBitmap(bitmap);
                }
        }

       
        public void onDrawShape(Shape shape, Paint paint) {
                prepareBitmaps();
                updateBitmap(mCanvas, mBitmap, shape, paint);
        }
 
        public void onDrawShapeTemp(Shape shape, Paint paint) {
                prepareBitmaps();
               synchronized (tmpCanvas) {
            	   //float sx = 0, sy = 0;
            	   //tmpCanvas.scale( sx,sy);
                        tmpCanvas.drawBitmap(mBitmap,0,0, null);
                }
                updateBitmap(tmpCanvas, tmpBitmap, shape, paint);
        }
    
   


public void onDrawAll(ArrayList<Path> paths, Paint paint) {
	// TODO Auto-generated method stub
	 prepareBitmaps();
     synchronized (mCanvas) {
    	 mCanvas.drawARGB(255, 255, 255, 255); // "pobriši" vse 
         mCanvas.drawARGB(255, 255,255, 255); // "pobriši" vse 
    	  for(Path path : paths)
              mCanvas.drawPath(path , paint);
      }
     // updateBitmap(tmpCanvas, tmpBitmap,paths, paint);
     synchronized (mBitmap) {
        // tmpCanvas.drawPath(paths, paint);
         drawBitmap(mBitmap);
 }
	
}

+ še vse metode kot so pixel,hue itd razmišlajm o tem da bi jih naredil na osnovi c-ja ali pa česa drugega, ker so svinsko počasne do 10 sekund na simulatorju na telefonu do 2 sekunde..

-shape
-line
-rectangle

Po večini je to to....

g333kk ::

da ti še pokažem:
Takle je napačna, slika ko naredi simulator malo po svoje enako se naredi na telefonu :

takale je pa prava, oz delujoča verzija..:

c00L3r ::

Tu pa žal nimam izkupenj z "real-time" risanjem po panelu. Pri meni je že app toliko drugačem da naprej vem katero sliko moram narisat, kak jo pomajšat/rotirat in če še kaj dodam.

Pa si pogledal različne primere na net-u za risanje po panelu? Sigurno se najde kaj, ki dela hitro.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] pomoč pri postavitvi layouta

Oddelek: Programiranje
122009 (1767) icurk
»

[Android] Splošno

Oddelek: Programiranje
351936 (1066) piki12
»

Programiranje problem android

Oddelek: Programiranje
51090 (855) g333kk
»

[Android] Aplikacija se zruši

Oddelek: Programiranje
6740 (577) g333kk
»

android črta

Oddelek: Programiranje
412270 (1541) g333kk

Več podobnih tem