ssummeraw 2013-04-26 05:33 采纳率: 10%
浏览 2677
已采纳

android 中的签名问题

在android应用程序中用户在程序的表格中做了签名,签名必须要编辑,清除,保存,我做了保存和清除,但是编辑这项功能却不能运行。我的代码如下,怎么修改呢?

mContent = (LinearLayout) findViewById(R.id.linearLayout);
mSignature = new signature(this, null);
mSignature.setBackgroundColor(Color.WHITE);
mContent.addView(mSignature, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
mClear = (Button)findViewById(R.id.clear);
mGetSign = (Button)findViewById(R.id.getsign);
mGetSign.setEnabled(false);
mCancel = (Button)findViewById(R.id.cancel);
mView = mContent;
mClear.setOnClickListener(new OnClickListener() 
    {        
        public void onClick(View v) 
        {
            Log.v("log_tag", "Panel Cleared");

            mSignature.clear();
            mGetSign.setEnabled(false);
        }
    });
    mGetSign.setOnClickListener(new OnClickListener() 
    {        
        public void onClick(View v) 
        {
            Log.v("log_tag", "Panel Saved");

                mView.setDrawingCacheEnabled(true);
                mSignature.save(mView);
                Bundle b = new Bundle();
                b.putString("status", "done");
                b.putParcelable("data", mBitmap);
                Intent intent = new Intent();
                intent.putExtras(b);
                setResult(RESULT_OK,intent);   
                finish();
            }
    });
    mCancel.setOnClickListener(new OnClickListener() 
    {        
        public void onClick(View v) 
        {
            Log.v("log_tag", "Panel Canceled");
            Bundle b = new Bundle();
            b.putString("status", "cancel");
            Intent intent = new Intent();
            intent.putExtras(b);
            setResult(RESULT_OK,intent);  
            finish();
        }
    });

}
@Override
protected void onDestroy() {
    Log.w("GetSignature", "onDestory");
    super.onDestroy();
}
public class signature extends View 
    {
        private static final float STROKE_WIDTH = 5f;
        private static final float HALF_STROKE_WIDTH = STROKE_WIDTH / 2;
        private Paint paint = new Paint();
        private Path path = new Path();
        private float lastTouchX;
        private float lastTouchY;
        private final RectF dirtyRect = new RectF();
        public signature(Context context, AttributeSet attrs) 
        {
            super(context, attrs);
            paint.setAntiAlias(true);
            paint.setColor(Color.BLACK);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeWidth(STROKE_WIDTH);
        }
        public void save(View v) 
        {
            Log.v("log_tag", "Width: " + v.getWidth());
            Log.v("log_tag", "Height: " + v.getHeight());
            if(mBitmap == null)
            {
                mBitmap =  Bitmap.createBitmap (mContent.getWidth(), mContent.getHeight(), Bitmap.Config.RGB_565);;
            }
            Canvas canvas = new Canvas(mBitmap);
            try
            {
                FileOutputStream mFileOutStream = new FileOutputStream(mypath);
                v.draw(canvas); 
                mBitmap.compress(Bitmap.CompressFormat.PNG, 90, mFileOutStream); 
                mFileOutStream.flush();
                mFileOutStream.close();
               // String url = Images.Media.insertImage(getContentResolver(), mBitmap, "title", null);
               // Log.v("log_tag","url: " + url);
                //In case you want to delete the file
                //boolean deleted = mypath.delete();
                //Log.v("log_tag","deleted: " + mypath.toString() + deleted);
                //If you want to convert the image to string use base64 converter
            }
            catch(Exception e) 
            { 
                Log.v("log_tag", e.toString()); 
            } 
        }
        public void clear() 
        {
            path.reset();
          invalidate();
        }
        @Override
        protected void onDraw(Canvas canvas) 
        {
            canvas.drawPath(path, paint);
        }
        @Override
        public boolean onTouchEvent(MotionEvent event) 
        {
            float eventX = event.getX();
            float eventY = event.getY();
            mGetSign.setEnabled(true);
            switch (event.getAction()) 
            {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(eventX, eventY);
                lastTouchX = eventX;
                lastTouchY = eventY;
               return true;
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                resetDirtyRect(eventX, eventY);
                int historySize = event.getHistorySize();
                for (int i = 0; i < historySize; i++) 
                {
                    float historicalX = event.getHistoricalX(i);
                    float historicalY = event.getHistoricalY(i);
                    expandDirtyRect(historicalX, historicalY);
                    path.lineTo(historicalX, historicalY);
                }
                path.lineTo(eventX, eventY);
               break;
            default:
                debug("Ignored touch event: " + event.toString());
                return false;
            }
            invalidate((int) (dirtyRect.left - HALF_STROKE_WIDTH),
                    (int) (dirtyRect.top - HALF_STROKE_WIDTH),
                    (int) (dirtyRect.right + HALF_STROKE_WIDTH),
                    (int) (dirtyRect.bottom + HALF_STROKE_WIDTH));

            lastTouchX = eventX;
            lastTouchY = eventY;
            return true;
        }
        private void debug(String string){
        }
        private void expandDirtyRect(float historicalX, float historicalY) 
        {
            if (historicalX < dirtyRect.left) 
            {
                dirtyRect.left = historicalX;
            } 
            else if (historicalX > dirtyRect.right) 
            {
                dirtyRect.right = historicalX;
            }

            if (historicalY < dirtyRect.top) 
            {
                dirtyRect.top = historicalY;
            } 
            else if (historicalY > dirtyRect.bottom) 
            {
                dirtyRect.bottom = historicalY;
            }
        }
        private void resetDirtyRect(float eventX, float eventY) 
        {
            dirtyRect.left = Math.min(lastTouchX, eventX);
            dirtyRect.right = Math.max(lastTouchX, eventX);
            dirtyRect.top = Math.min(lastTouchY, eventY);
            dirtyRect.bottom = Math.max(lastTouchY, eventY);
        }
    }
  • 写回答

1条回答

  • myq_26 2013-04-26 08:30
    关注

    可能 Custom View 会有所帮助,在 XML中,使用 me.other.SignatureView

    package me.other;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Path;
    import android.os.SystemClock;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    /**
     * A simple view to capture a path traced onto the screen. Initially intended to be used to captures signatures.
     * 
     * @author Andrew Crichton
     * @version 0.1
     */
    public class SignatureView extends View {
        @SuppressWarnings("unused")
        private Path mPath;
        private Paint mPaint; 
        private Paint bgPaint = new Paint(Color.TRANSPARENT);
        private Bitmap mBitmap;
        private Canvas mCanvas;
        private float curX, curY;
        private static final int TOUCH_TOLERANCE = 4;
        private static final int STROKE_WIDTH = 4;
        public SignatureView(Context context) {
            super(context);
            init();
        }
        public SignatureView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
        public SignatureView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }
        private void init() {
            setFocusable(true);
            mPath = new Path();
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setColor(Color.WHITE);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(STROKE_WIDTH);
        }
        public void setSigColor(int color) {
            mPaint.setColor(color);
        }
        public void setSigColor(int a, int red, int green, int blue) {
            mPaint.setARGB(a, red, green, blue);
        }
        public boolean clearSignature() {
            if (mBitmap != null)
                createFakeMotionEvents();
            if (mCanvas != null) {
                mCanvas.drawColor(Color.BLACK);
                mCanvas.drawPaint(bgPaint);
                mPath.reset();
                invalidate();
            }
            else {
                return false;
            }
            return true;
        }
        public Bitmap getImage() {
            return this.mBitmap;
        }
        public void setImage(Bitmap bitmap) {
            this.mBitmap = bitmap;
            this.invalidate();
        }
        @Override
        protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
            int bitmapWidth = mBitmap != null ? mBitmap.getWidth() : 0;
            int bitmapHeight = mBitmap != null ? mBitmap.getWidth() : 0;
            if (bitmapWidth >= width && bitmapHeight >= height) 
                return;
            if (bitmapWidth < width) 
                bitmapWidth = width;
            if (bitmapHeight < height) 
                bitmapHeight = height;
            Bitmap newBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
            Canvas newCanvas = new Canvas();
            newCanvas.setBitmap(newBitmap);
            if (mBitmap != null) 
                newCanvas.drawBitmap(mBitmap, 0, 0, null);
            mBitmap = newBitmap;
            mCanvas = newCanvas;
        }
        private void createFakeMotionEvents() {
            MotionEvent downEvent = MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+100, MotionEvent.ACTION_DOWN, 1f, 1f ,0);
            MotionEvent upEvent = MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis()+100, MotionEvent.ACTION_UP, 1f, 1f ,0);
            onTouchEvent(downEvent);
            onTouchEvent(upEvent);
        }
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.BLACK);
            canvas.drawBitmap(mBitmap, 0, 0, mPaint); 
            canvas.drawPath(mPath, mPaint);
        }
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX();
            float y = event.getY();
    
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchDown(x, y);
                break;
            case MotionEvent.ACTION_MOVE:
                touchMove(x, y);
                break;
            case MotionEvent.ACTION_UP:
                touchUp();
                break;
            }
            invalidate();
            return true;
        }
        /**----------------------------------------------------------
         * Private methods
         **---------------------------------------------------------*/
        private void touchDown(float x, float y) {
            mPath.reset();
            mPath.moveTo(x, y);
            curX = x;
            curY = y;
        }
    
        private void touchMove(float x, float y) {
            float dx = Math.abs(x - curX);
            float dy = Math.abs(y - curY);
            if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
                mPath.quadTo(curX, curY, (x + curX)/2, (y + curY)/2);
                curX = x;
                curY = y;
            }
        }
        private void touchUp() {
            mPath.lineTo(curX, curY);
            if (mCanvas == null) {
                mCanvas = new Canvas();
                mCanvas.setBitmap(mBitmap);
            }
            mCanvas.drawPath(mPath, mPaint);
            mPath.reset();
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧