2015-02-19 1 views
0

Im мое приложение для рисования, когда я рисую дорожку, оно появляется на черном квадрате, но не должно быть так, пожалуйста, просветите меня. Это мой код скриншот: http://tinypic.com/r/2d9cuhl/8Картинка для рисования/рисования Android с прозрачным фоном

//setup drawing 
private void setupDrawing(){ 
    drawPath = new Path(); 
    drawPaint = new Paint(); 
    drawPaint.setColor(paintColor); 
    drawPaint.setAntiAlias(true); 
    drawPaint.setStrokeWidth(20); 
    drawPaint.setStyle(Paint.Style.STROKE); 
    drawPaint.setStrokeJoin(Paint.Join.ROUND); 
    drawPaint.setStrokeCap(Paint.Cap.ROUND); 
    drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    canvasPaint = new Paint(Paint.DITHER_FLAG); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); 
    canvas.drawPath(drawPath, drawPaint); 
} 
+0

только предположение, но удалить PorterDuffXfermode ... –

ответ

-1

это может помочь вам

LinearLayout mContent; 
signature mSignature; 
Button mClear, mGetSign, mCancel; 
public int count = 1; 
public String current = null; 
private Bitmap mBitmap; 
public Canvas mCanvas; 
View mView; 
File mypath; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.signature); 


    mContent = (LinearLayout) findViewById(R.id.linearLayout); 
    mSignature = new signature(this, null); 
    mSignature.setBackgroundColor(Color.TRANSPARENT); 

    mContent.addView(mSignature, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
    mClear = (Button)findViewById(R.id.clear); 
    mGetSign = (Button)findViewById(R.id.getsign); 
    mGetSign.setEnabled(false); 
    mCancel = (Button)findViewById(R.id.cancel); 
    mView = mContent; 


    mClear.setOnClickListener(new OnClickListener() 
    {   
     public void onClick(View v) 
     { 
      Log.v("log_tag", "Panel Cleared"); 
      mSignature.clear(); 
      mGetSign.setEnabled(false); 
     } 
    }); 

    mGetSign.setOnClickListener(new OnClickListener() 
    {   
     public void onClick(View v) 
     { 
      mSignature.save(); 
     } 
    }); 

    mCancel.setOnClickListener(new OnClickListener() 
    {   
     public void onClick(View v) 
     { 
      Log.v("log_tag", "Panel Canceled"); 
      Bundle b = new Bundle(); 
      b.putString("status", "cancel"); 
      Intent intent = new Intent(); 
      intent.putExtras(b); 
      setResult(RESULT_OK,intent); 
      finish(); 
     } 
    }); 

} 

@Override 
protected void onDestroy() { 
    Log.w("GetSignature", "onDestory"); 
    super.onDestroy(); 
} 

public class signature extends View 
{ 
    private static final float STROKE_WIDTH = 5f; 
    private static final float HALF_STROKE_WIDTH = STROKE_WIDTH/2; 
    private Paint paint = new Paint(); 
    private Path path = new Path(); 
    private Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG); 

    private float lastTouchX; 
    private float lastTouchY; 
    private final RectF dirtyRect = new RectF(); 

    public signature(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     paint.setAntiAlias(true); 
     paint.setColor(Color.WHITE); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeJoin(Paint.Join.ROUND); 
     paint.setStrokeWidth(12); 



    } 
    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
    } 

    public void save() 
    { 

      mContent.draw(mCanvas); 
      ByteArrayOutputStream bs = new ByteArrayOutputStream(); 
      mBitmap.compress(Bitmap.CompressFormat.PNG, 50, bs); 
      Intent intent = new Intent(); 
      intent.putExtra("byteArray", bs.toByteArray()); 
      setResult(1, intent); 
      finish(); 
    } 

    public void clear() 
    { 
     path.reset(); 
     invalidate(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(path, paint); 


    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     float eventX = event.getX(); 
     float eventY = event.getY(); 
     mGetSign.setEnabled(true); 

     switch (event.getAction()) 
     { 
     case MotionEvent.ACTION_DOWN: 
      path.moveTo(eventX, eventY); 
      lastTouchX = eventX; 
      lastTouchY = eventY; 
      return true; 

     case MotionEvent.ACTION_MOVE: 

     case MotionEvent.ACTION_UP: 

      resetDirtyRect(eventX, eventY); 
      int historySize = event.getHistorySize(); 
      for (int i = 0; i < historySize; i++) 
      { 
       float historicalX = event.getHistoricalX(i); 
       float historicalY = event.getHistoricalY(i); 
       expandDirtyRect(historicalX, historicalY); 
       path.lineTo(historicalX, historicalY); 
      } 
      path.lineTo(eventX, eventY); 
      break; 

     default: 
      debug("Ignored touch event: " + event.toString()); 
      return false; 
     } 

     invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH), 
       (int) (dirtyRect.top - HALF_STROKE_WIDTH), 
       (int) (dirtyRect.right + HALF_STROKE_WIDTH), 
       (int) (dirtyRect.bottom + HALF_STROKE_WIDTH)); 

     lastTouchX = eventX; 
     lastTouchY = eventY; 

     return true; 
    } 

    private void debug(String string){ 
    } 

    private void expandDirtyRect(float historicalX, float historicalY) 
    { 
     if (historicalX < dirtyRect.left) 
     { 
      dirtyRect.left = historicalX; 
     } 
     else if (historicalX > dirtyRect.right) 
     { 
      dirtyRect.right = historicalX; 
     } 

     if (historicalY < dirtyRect.top) 
     { 
      dirtyRect.top = historicalY; 
     } 
     else if (historicalY > dirtyRect.bottom) 
     { 
      dirtyRect.bottom = historicalY; 
     } 
    } 
    private void resetDirtyRect(float eventX, float eventY) 
    { 
     dirtyRect.left = Math.min(lastTouchX, eventX); 
     dirtyRect.right = Math.max(lastTouchX, eventX); 
     dirtyRect.top = Math.min(lastTouchY, eventY); 
     dirtyRect.bottom = Math.max(lastTouchY, eventY); 
    } 
} 

}

+2

Просьба предоставить некоторую информацию о том, почему это отвечает на вопрос , – nikaltipar

+0

потому что я сталкиваюсь с такими же проблемами относительно этого –

+0

Просьба уточнить ответ и сконденсировать его только в том, что необходимо в качестве решения вопроса. –

0

Может быть, я не правильно понял, но я нашел ответ на мой вопрос, для кого есть эта проблема: необходимо отключить аппаратное ускорение в манифесте или просто в том представлении, которое вы рисуете. More Here

Для деятельности в Manifest.xml: <activity android:hardwareAccelerated="false" />

Для конкретного зрения только: view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Смежные вопросы