2015-07-20 12 views
5

Zajmuję się tworzeniem aplikacji, która potrzebuje tej funkcji w obiekcie.Jak wymazać obraz palcem w Androidzie

Mam jeden obraz, który obejmować B. obrazu z palca muszę wymazać dysku A pokazać B. Obrazek Erase musi śledzić palcem płynącej dysku A

Próbuję trochę kodu, ale nadal nie mogę wymazać obrazu A. jest to kod, który używam, aby narysować linię na obrazie (_imageToErase jest Obrazek a):

Canvas canvas; 
Paint paint; 
float downx = 0, downy = 0, upx = 0, upy = 0; 
ImageView _imageToErase; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.g_layout); 

    _imageToErase = (ImageView) findViewById(R.id.image_to_erase); 

    _imageToErase.setOnTouchListener(this); 
} 

@Override 
public void onWindowFocusChanged(boolean hasFocus){ 

    int width = _imageToErase.getWidth(); 
    int height = _imageToErase.getHeight(); 

    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    canvas = new Canvas(bitmap); 
    paint = new Paint(); 
    paint.setColor(Color.WHITE); 
    paint.setStrokeWidth(25); 
    paint.setAntiAlias(true); 
    _imageToErase.setImageBitmap(bitmap); 
} 

public boolean onTouch(View v, MotionEvent event) { 
    int action = event.getAction(); 

    switch (action){ 
     case MotionEvent.ACTION_DOWN: 
      downx = event.getX(); 
      downy = event.getY(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      upx = event.getX(); 
      upy = event.getY(); 
      canvas.drawLine(downx, downy, upx, upy, paint); 
      _imageToErase.invalidate(); 
      downx = upx; 
      downy = upy; 
      break; 
     case MotionEvent.ACTION_UP: 
      break; 
     case MotionEvent.ACTION_CANCEL: 
      break; 
     default: 
      break; 
    } 

    return true; 
} 

Ten kod produkować tylko linii, które podążają za palcem, ale nie kasuj obrazu.

Jak zmodyfikować ten kod, aby usunąć obraz? Dzięki

EDIT

Link sugerowane w komentarzach nie rozwiązać mój problem. Po prostu dodaj tę linię:

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)); 

nie działa dla mnie.

+0

Twój farba jest biały. Przynajmniej potrzebujesz przezroczystej farby. – njzk2

+0

możliwy duplikat [Rysowanie za pomocą przezroczystej farby na Androidzie] (http://stackoverflow.com/questions/27982853/drawing-with-transparent-paint-on-android) – njzk2

+0

@ njzk2 tak wiem, i faktycznie jestem Próbowałem z przezroczystym, ale po prostu nie widzę linii, ale obraz A jest zawsze tam. I to pytanie nie działa dla mnie – Ilario

Odpowiedz

1

Wreszcie znalazłem biblioteki, który działa bardzo dobrze dla mnie i realizacja jest dość prosta

https://github.com/winsontan520/Android-WScratchView

biblioteki importu w projekcie, a następnie w layout.xml

<com.winsontan520.WScratchView 
    android:layout_width="287dp" 
    android:layout_height="212dp" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="80dp" 
    android:adjustViewBounds="true" 
    android:scaleType="centerInside" 
    android:id="@+id/image_to_erase"/> 

w onCreate:

_imageToErase = (WScratchView) findViewById(R.id.image_to_erase); 
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img_erase); 

_imageToErase.setScratchBitmap(bitmap); 


_imageToErase.setOnScratchCallback(new WScratchView.OnScratchCallback() { 
     @Override 
     public void onScratch(float percentage) { 
      updatePercentage(percentage); 
     } 

     @Override 
     public void onDetach(boolean fingerDetach) { 
      if (mPercentage > 40) { 
       _imageToErase.setScratchAll(true); 
       updatePercentage(100); 
      } 
     } 
    }); 

i

private void updatePercentage(float percentage) { 

    mPercentage = percentage; 
// System.out.println("percentage = "+percentage); 
} 

Dzięki wszyscy

2

PaintView.java

public class PaintView extends View implements View.OnTouchListener { 

    private static final String TAG = "PaintView"; 
    Bitmap Bitmap1, Bitmap2; 
    Bitmap Transparent; 
    int X = -100; 
    int Y = -100; 
    Canvas c2; 
    private boolean isTouched = false; 

    Paint paint = new Paint(); 

    Path drawPath = new Path(); 

public PaintView(Context context) { 
    super(context); 
    setFocusable(true); 
    setFocusableInTouchMode(true); 
    this.setOnTouchListener(this); 

    DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
    int width = metrics.widthPixels; 
    int height = metrics.heightPixels; 

    Transparent = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
    Bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.cake1); 
    Bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.cake2); 

    c2 = new Canvas(); 
    c2.setBitmap(Transparent); 
    c2.drawBitmap(Bitmap2, 0, 0, paint); 

    paint.setAlpha(0); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeJoin(Paint.Join.ROUND); 
    paint.setStrokeCap(Paint.Cap.ROUND); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
    paint.setAntiAlias(true); 
} 

private static Point getDisplaySize(final Display display) { 
    final Point point = new Point(); 
    point.x = display.getWidth(); 
    point.y = display.getHeight(); 
    return point; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    System.out.println("onDraw"); 

    if(isTouched) 
    { 
     canvas.drawBitmap(Bitmap1, 0, 0, null); 

    } 
    canvas.drawBitmap(Transparent, 0, 0, null); 
} 

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    isTouched = true; 
    X = (int) event.getX(); 
    Y = (int) event.getY(); 

    paint.setStrokeWidth(60); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      drawPath.moveTo(X, Y); 
      c2.drawPath(drawPath, paint); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      drawPath.lineTo(X, Y); 
      c2.drawPath(drawPath, paint); 
      break; 
     case MotionEvent.ACTION_UP: 
      drawPath.lineTo(X, Y); 
      c2.drawPath(drawPath, paint); 
      drawPath.reset(); 
      count=0; 
      break; 
     default: 
      return false; 
    } 

    invalidate(); 
    return true;}}class Point { 
float x, y; 

@Override 
public String toString() { 
    return x + ", " + y; 
}} 

MainActivity.java

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(new PaintView(this)); 
}} 
+0

Czy możliwe byłoby obliczenie procentu usuniętego Obrazu? – Ale

Powiązane problemy