3
  1. I put Signatureview inside Android Scrollview.

  2. But while writing something on SignatureView, scrolling up and down I'm not able to write my sign.

How to Disable the Scrollview when SignatureView is touched

Link to referred signature

Sign.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        >

<ScrollView
            android:id="@+id/scrollView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:isScrollContainer="false"
            android:paddingBottom="30dp"
            android:paddingLeft="2dp"
            android:paddingRight="2dp"
            android:scrollbars="none">

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical">


        <com.kyanogen.signatureview.SignatureView
            xmlns:sign="http://schemas.android.com/apk/res-auto"
            android:id="@+id/signature_view"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:minHeight="250dp"
            android:layout_weight="1"
            sign:penSize="5dp"
            sign:backgroundColor="#ffffff"
            sign:penColor="#000000"
            sign:enableSignature="true"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="2">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/clearSignButton"
            android:layout_weight="1"
            android:text="clear"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/saveSignButton"
            android:layout_weight="1"
            android:text="save"/>
    </LinearLayout>
    </LinearLayout>
 </LinearLayout>
</Scrolview>

Main.java

package com.example.parsaniahardik.signaturedemo;

import android.graphics.Bitmap;
import android.media.MediaScannerConnection;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.kyanogen.signatureview.SignatureView;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;

public class MainActivity extends AppCompatActivity {

    Bitmap bitmap;
    Button clear,save;
    SignatureView signatureView;
    String path;
    private static final String IMAGE_DIRECTORY = "/signdemo";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        signatureView =  (SignatureView) findViewById(R.id.signature_view);
        clear = (Button) findViewById(R.id.clear);
        save = (Button) findViewById(R.id.save);

        clear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signatureView.clearCanvas();
            }
        });

        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bitmap = signatureView.getSignatureBitmap();
                path = saveImage(bitmap);
            }
        });


    }
    public String saveImage(Bitmap myBitmap) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
        File wallpaperDirectory = new File(
                Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY /*iDyme folder*/);
        // have the object build the directory structure, if needed.
        if (!wallpaperDirectory.exists()) {
            wallpaperDirectory.mkdirs();
            Log.d("hhhhh",wallpaperDirectory.toString());
        }

        try {
            File f = new File(wallpaperDirectory, Calendar.getInstance()
                    .getTimeInMillis() + ".jpg");
            f.createNewFile();
            FileOutputStream fo = new FileOutputStream(f);
            fo.write(bytes.toByteArray());
            MediaScannerConnection.scanFile(MainActivity.this,
                    new String[]{f.getPath()},
                    new String[]{"image/jpeg"}, null);
            fo.close();
            Log.d("TAG", "File Saved::--->" + f.getAbsolutePath());

            return f.getAbsolutePath();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        return "";

    }
}
Community
  • 1
  • 1
Kumar
  • 969
  • 2
  • 22
  • 56

2 Answers2

5

when you want to sign you need to intercept the scroll event when the signature is touched. and when you are outside of the signature area turn back the normal status: the scrollView intercept the scroll event. inside onCreate in your controller add the following :

signatureView.setOnTouchListener(new View.OnTouchListener(){
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            int action = motionEvent.getAction();
            switch (action){
                case MotionEvent.ACTION_DOWN:
                    // Disable the scroll view to intercept the touch event
                    scrollView1.requestDisallowInterceptTouchEvent(true);
                    return false;
                case MotionEvent.ACTION_UP:
                    // Allow scroll View to interceot the touch event
                    scrollView1.requestDisallowInterceptTouchEvent(false);
                    return true;
                case MotionEvent.ACTION_MOVE:
                    scrollView1.requestDisallowInterceptTouchEvent(true);
                    return false;
                default:
                    return true;
            }
        }
    });
Achref Gassoumi
  • 1,035
  • 10
  • 20
0

You have to intercept touch events in this SignatureView. The best approach is to subclass it and override onTouchEvent:

public class MySignatureView extends SignatureView {
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // intercept touch event here, so it's not passed to ScrollView
        super.onTouchEvent(event);
        return false;
    }
}

And then, of course change SignatureView to MySignatureView in your layout.

<com.your.package.name.MySignatureView
        xmlns:sign="http://schemas.android.com/apk/res-auto"
        android:id="@+id/signature_view"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:minHeight="250dp"
        android:layout_weight="1"
        sign:penSize="5dp"
        sign:backgroundColor="#ffffff"
        sign:penColor="#000000"
        sign:enableSignature="true"/>
pawelo
  • 1,405
  • 4
  • 15
  • 30
  • where i have to keep that Class Mysignatureview? – Kumar Aug 24 '16 at 13:56
  • Wherever you want. You can use anonymous class, inner class or completely separate class to do that. – pawelo Aug 24 '16 at 14:05
  • Can you let me know ,in my code where i have to modify what you suggested else add full code of Signature capture inside scrolview – Kumar Aug 25 '16 at 05:57