使用手指从抽屉视图获取位图

时间:2018-08-17 08:47:59

标签: android bitmap

我使用此片段用手指绘制了一些签名,效果很好,但是当我尝试保存位图时,我尝试使用此功能Bitmap bitmap = view.getDrawingCache();但它始终为Null,所以我的问题是如何获取真实文件位图以在之后使用它!

这是我的代码:

public class FingerDrawFragment extends DialogFragment
   {

private  RelativeLayout relativeLayout;
private Paint paint;
private View view;
private Path path2;
private Bitmap bitmap;
private Canvas canvas;


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.draw_fragment, container, false);

    Bundle b = getArguments();
    if(b != null)
    {
        int id = b.getInt("id");
        Boolean isInfraction = b.getBoolean("infraction");

        if(isInfraction)
              infraction =  realm.where(Infraction.class).equalTo("id",id).findFirst();
    }


    view = new SketchSheetView(getActivity());

    paint = new Paint();

    path2 = new Path();

    paint.setDither(true);

    paint.setColor(getResources().getColor(R.color.TealDark));

    paint.setStyle(Paint.Style.STROKE);

    paint.setStrokeJoin(Paint.Join.ROUND);

    paint.setStrokeCap(Paint.Cap.ROUND);

    paint.setStrokeWidth(2);

    ((RelativeLayout)  v.findViewById(R.id.body)).addView(view );

    ((TextView)v.findViewById(R.id.topBarTitle)).setText("Signature");

    v.findViewById(R.id.delete_draw).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            path2.reset();

        }
    });

    v.findViewById(R.id.save_draw).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder editalert = new AlertDialog.Builder(getActivity());
            editalert.setTitle("Please Enter the name with which you want to Save");
            final EditText input = new EditText(getActivity());
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.FILL_PARENT,
                    LinearLayout.LayoutParams.FILL_PARENT);
            input.setLayoutParams(lp);
            editalert.setView(input);
            editalert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {

                    String name= input.getText().toString();
                    Bitmap bitmap = view.getDrawingCache();

                    String root = Utils.getFirstWritableDirectory().toString();
                    File file =  new File(root + "/.SMS_Images/"+name+".png");

                    try
                    {
                        if(!file.exists())
                        {
                            file.createNewFile();
                        }
                        FileOutputStream ostream = new FileOutputStream(file);
                        bitmap.compress(Bitmap.CompressFormat.PNG, 10, ostream);
                        ostream.close();

                        view.invalidate();
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }finally
                    {

                        view.setDrawingCacheEnabled(false);
                    }
                }
            });

            editalert.show();
        }
    });

    return  v;
}

class SketchSheetView extends View {

    public SketchSheetView(Context context) {

        super(context);

        bitmap = Bitmap.createBitmap(820, 480, Bitmap.Config.ARGB_4444);

        canvas = new Canvas(bitmap);

        this.setBackgroundColor(Color.WHITE);
    }

    private ArrayList<DrawingClass> DrawingClassArrayList = new ArrayList<DrawingClass>();

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        DrawingClass pathWithPaint = new DrawingClass();

        canvas.drawPath(path2, paint);

        if (event.getAction() == MotionEvent.ACTION_DOWN) {

            path2.moveTo(event.getX(), event.getY());

            path2.lineTo(event.getX(), event.getY());
        }
        else if (event.getAction() == MotionEvent.ACTION_MOVE) {

            path2.lineTo(event.getX(), event.getY());

            pathWithPaint.setPath(path2);

            pathWithPaint.setPaint(paint);

            DrawingClassArrayList.add(pathWithPaint);
        }

        invalidate();
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (DrawingClassArrayList.size() > 0) {

            canvas.drawPath(
                    DrawingClassArrayList.get(DrawingClassArrayList.size() - 1).getPath(),

                    DrawingClassArrayList.get(DrawingClassArrayList.size() - 1).getPaint());
        }
    }
}

public class DrawingClass {

    Path DrawingClassPath;
    Paint DrawingClassPaint;

    public Path getPath() {
        return DrawingClassPath;
    }

    public void setPath(Path path) {
        this.DrawingClassPath = path;
    }


    public Paint getPaint() {
        return DrawingClassPaint;
    }

    public void setPaint(Paint paint) {
        this.DrawingClassPaint = paint;
    }
}

}

1 个答案:

答案 0 :(得分:1)

添加

view.setDrawingCacheEnabled(true);

之前

Bitmap bitmap = view.getDrawingCache();