First thanks to the great job!!!
I tried to add a signature pad, on a android application using a custom view:
public class Firma extends View{
// defines paint and canvas
private Paint drawPaint;
private Path path = new Path();
public Firma(Context context, AttributeSet attrs) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
setupPaint();
}
private void setupPaint() {
// Setup paint with color and stroke styles
drawPaint = new Paint();
int paintColor = Color.BLACK;
drawPaint.setColor(paintColor);
drawPaint.setAntiAlias(true);
drawPaint.setStrokeWidth(5);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);
setDrawingCacheEnabled( true );
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawPath(path, drawPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float pointX = event.getX();
float pointY = event.getY();
// Checks for the event that occurs
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path.moveTo(pointX, pointY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(pointX, pointY);
break;
default:
return false;
}
// Force a view to draw again
postInvalidate();
return true;
}
public void saveDrawing()
{
Bitmap whatTheUserDrewBitmap = getDrawingCache();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
whatTheUserDrewBitmap.compress(Bitmap.CompressFormat.PNG, 0, baos);
// LATER I WILL STORE IN A SQLITE BLOB
}
public void borraDrawing() {
// THIS HOPEFULLY WILL ERASE THE SIGNATURE PAD
setDrawingCacheEnabled(false);
invalidate();
setDrawingCacheEnabled(true);
}
}
I use this view with this layout:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/disclaimersign"
android:id="@+id/textView2"
android:textAppearance="?android:attr/textAppearanceLarge"
android:paddingEnd="10dp"
android:paddingStart="10dp"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_marginTop="48dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/signature"
android:id="@+id/textView3"
android:paddingEnd="20dp"
android:paddingStart="20dp"
android:layout_marginTop="137dp"
android:layout_below="@+id/textView2"
android:layout_alignParentStart="true" />
<com.eternity.josep.eternityservice.views.Firma
android:id="@+id/firma"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/textView3"
android:background="#e1fcf3"
android:layout_above="@+id/email" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:labelFor="@+id/email"
android:text="@string/contactmail"
android:id="@+id/l_email"
android:layout_above="@+id/signReset"
android:layout_alignStart="@+id/signReset" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:ems="10"
android:id="@+id/email"
android:layout_above="@+id/signReset"
android:layout_alignEnd="@+id/signSave"
android:layout_toEndOf="@+id/signReset" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/SignReset"
android:id="@+id/signReset"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:layout_marginStart="38dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/SaveSign"
android:id="@+id/signSave"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_marginEnd="40dp" />
I tried to manage from a fragment:
public class FragmentSign extends Fragment {
View view;
Firma firma;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
view = inflater.inflate(R.layout.fragment_sign, container, false);
super.onCreate(savedInstanceState);
return view;
}
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
Button borra = (Button) view.findViewById(R.id.signReset);
Button guarda = (Button) view.findViewById(R.id.signSave);
firma=new Firma(getActivity(),null);
borra.setOnClickListener(
new View.OnClickListener() {
public void onClick(View view) {
try {
firma.borraDrawing();
}catch(Exception e )
{
Log.d("LOGTAG",e.getMessage() );
}
}
});
guarda.setOnClickListener(
new View.OnClickListener() {
public void onClick(View view) {
try {
firma.saveDrawing();
}catch(Exception e )
{
Log.d("LOGTAG",e.getMessage() );
}
}
});
}
}
My problem is that when i debug here
public void saveDrawing()
{ Bitmap whatTheUserDrewBitmap = getDrawingCache();
getDrawingCache() is null, and not the same that when I debug here
case MotionEvent.ACTION_DOWN:
path.moveTo(pointX, pointY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(pointX, pointY);
break;
Could anybody gime an idea about the reason of this?
Thanks again.
