用手指在Canvas上绘图,Android。

9 浏览
0 Comments

用手指在Canvas上绘图,Android。

我需要建立一个通过手指在画布上绘图的项目。\n如何获取手指的触摸事件和运动事件,然后进行绘制?

0
0 Comments

原因:这段代码演示了如何在Android中使用手指在画布上绘制图形。然而,问题是无法通过手指在画布上绘制。

解决方法:为了解决这个问题,需要对代码进行一些修改。具体的修改如下:

1. 在DoodleCanvas类中添加一个成员变量:

private List mPaths = new ArrayList<>();

2. 修改onTouchEvent方法中的ACTION_DOWN和ACTION_MOVE部分:

case MotionEvent.ACTION_DOWN:
    mPath = new Path();
    mPath.moveTo(event.getX(), event.getY());
    mPaths.add(mPath);
    break;
case MotionEvent.ACTION_MOVE:
    mPath.lineTo(event.getX(), event.getY());
    invalidate();
    break;

3. 修改onDraw方法:

protected void onDraw(Canvas canvas) {
    for (Path path : mPaths) {
        canvas.drawPath(path, mPaint);
    }
    super.onDraw(canvas);
}

通过以上修改,可以实现通过手指在画布上绘制图形。

0
0 Comments

问题:在Canvas上使用手指绘图时,如何清除绘制内容以及如何保存绘制内容?width和height变量是如何获取的?

原因:代码中没有提供清除绘制内容和保存绘制内容的方法,导致用户困惑。

解决方法:添加清除绘制内容和保存绘制内容的方法,并在onSizeChanged方法中设置width和height变量的值。

清除绘制内容的方法:

public void clearDrawing()
{
    setDrawingCacheEnabled(false);
    onSizeChanged(width, height, width, height);
    invalidate();
    setDrawingCacheEnabled(true);
}

保存绘制内容的方法:

public void saveDrawing()
{
    Bitmap whatTheUserDrewBitmap = getDrawingCache();
    whatTheUserDrewBitmap = ThumbnailUtils.extractThumbnail(whatTheUserDrewBitmap, 256, 256);
    ImageView testArea = ...
    testArea.setImageBitmap(whatTheUserDrewBitmap);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    whatTheUserDrewBitmap.compress(Bitmap.CompressFormat.PNG, 0, baos);
    byte[] yourByteArray;
    yourByteArray = baos.toByteArray();
}

width和height变量的获取:

在onSizeChanged方法中,通过参数w和h获取宽度和高度,并将其赋值给width和height变量。

注意:如果想要刷新绘图区域,需要调用invalidate()方法。

希望这对你有帮助!

0
0 Comments

在这段代码中,出现了一个问题:无法保存绘制的结果。为了解决这个问题,可以添加一个保存功能的代码。

在MainActivity类中的onOptionsItemSelected()方法中添加以下代码:

case Save:
    AlertDialog.Builder editalert = new AlertDialog.Builder(MainActivity.this);
    editalert.setTitle("请输入保存的文件名");
    final EditText input = new EditText(MainActivity.this);
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.FILL_PARENT,
            LinearLayout.LayoutParams.FILL_PARENT);
    input.setLayoutParams(lp);
    editalert.setView(input);
    editalert.setPositiveButton("确定", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            String name = input.getText().toString();
            Bitmap bitmap = dv.getDrawingCache();
            String path = Environment.getExternalStorageDirectory().getAbsolutePath();
            File file = new File(path + "/" + name + ".png");
            try {
                if (!file.exists()) {
                    file.createNewFile();
                }
                FileOutputStream ostream = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.PNG, 10, ostream);
                ostream.close();
                dv.invalidate();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                dv.setDrawingCacheEnabled(false);
            }
        }
    });
    editalert.show();
    return true;

这样,用户可以在绘制完成后点击菜单中的保存选项,输入文件名后保存绘制的结果。

0