我正在做应用程序,如绘图应用程序...所有的东西都很好..但现在我想添加铅笔的宽度..
因为那已经完成了
mPaint.setStrokeWidth(seekbarvalue);
但问题是它适用于不绘画但我想仅在下一张图纸上应用它......我该怎么做?
我的代码是
private void touch_start(float x, float y) {
mPath.reset();
mPath.moveTo(x, y);
mX = x;
mY = y;
}
private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
mX = x;
mY = y;
}
}
private void touch_up() {
mPath.lineTo(mX, mY);
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath = new Path();
paths.add(new PathPoints(mPath, color, false));
}
private void drawText(int x, int y) {
Log.v(TAG, "Here");
Log.v(TAG, "X " + x + " Y " + y);
this.x = x;
this.y = y;
paths.add(new PathPoints(color, textToDraw, true, x, y));
// mCanvas.drawText(textToDraw, x, y, mPaint);
}
@Override
public boolean onTouch(View arg0, MotionEvent event) {
isTouched = true;
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!isTextModeOn) {
touch_start(x, y);
invalidate();
}
break;
case MotionEvent.ACTION_MOVE:
if (!isTextModeOn) {
touch_move(x, y);
invalidate();
}
break;
case MotionEvent.ACTION_UP:
if (isTextModeOn) {
drawText((int) x, (int) y);
invalidate();
} else {
touch_up();
invalidate();
}
break;
}
return true;
}
这是seekbaar
sekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (fromUser) {
mPaint.setStrokeWidth(progress);
}
}
});
但它适用于整个绘图
这是我的提取方式
protected void onDraw(Canvas canvas1) {
canvas = canvas1;
// === canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
invalidate();
mPaint.setStrokeWidth(GlobalVar.getSeekvalue());
invalidate();
canvas.drawBitmap(Transparent, 0, 0, mBitmapPaint);
c2.drawBitmap(Bitmap2, 0, 0, mBitmapPaint);
// canvas.drawBitmap(Transparent, 0, 0, mBitmapPaint);
// canvas.drawBitmap(Transparent, 0, 0, null);
// c2.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
for (PathPoints p : paths) {
mPaint.setColor(p.getColor());
Log.v("", "Color code : " + p.getColor());
if (p.isTextToDraw()) {
canvas.drawText(p.textToDraw, p.x, p.y, mPaint);
} else {
// if(isTouched)
// {
// canvas.drawPath(p.getPath(), mPaint);
c2.drawPath(p.getPath(), mPaint);
我需要做什么?
答案 0 :(得分:1)
您可以使用具有不同笔划的油漆池(重要:)使其成为不连续的部分。宽度为4px,8px,12px,14px,18px和22px。
Paint basePaint=new Paint();
SparseArray<Paint>poolPaint=new SparseArray<Paint>();
Paint currPaint; //<- that's your paint that change width stroke on progressbar seek
sekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// make it discrete not like here for every single width is not worthy
int widthPaint=progress;
if (fromUser) {
if((currPaint=poolPaint.get(widthPaint))==null){
Paint newPaint= new Paint(basePaint).setStrokeWidth(widthPaint)
poolPaint.put(widthPaint,newPaint);
currPaint=newPaint;
}
}
}
});
答案 1 :(得分:1)
在PathPoint对象中设置另一个字段,并将其命名为strokWidth和:
private void touch_up() {
mPath.lineTo(mX, mY);
int strokWidth = GlobalVar.getSeekvalue();
// commit the path to our offscreen
mPaint.setStrokeWidth(strokWidth);
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath = new Path();
paths.add(new PathPoints(mPath, color, false));
}
并更改每个
paths.add(new PathPoints(mPath, color, false));
到
paths.add(new PathPoints(mPath, color, false,strokWidth));
现在在ondraw方法和for循环中:
for (PathPoints p : paths) {
mPaint.setColor(p.getColor());
mPaint.setStrokeWidth(p.getStrokWidth());
现在我觉得这些行没用:
invalidate();
mPaint.setStrokeWidth(GlobalVar.getSeekvalue());
invalidate();