Android 之小画板

   继android计算器后的进击版  android的流行也让我们这种android的日志有了展现的价值  技术的天堂有你也有我  在这个经济利益的社会  希望我的飞蛾扑火可以让你感到一丝的温暖  让你对未来充满希望
       不管未来的岁月如何变化  我只是想保持现有渴望汲取知识的状态  即使踽踽独行  我也要坚持的走下去  即使在无人注目的暗夜中  我也希望自己能够动情的燃烧着  为答谢那一段无怨无悔的岁月 

/Painter3/src/com/wupic/painter/Circle.java

import android.graphics.Canvas;

public class Circle extends Shape {

	public Circle(float x, float y, int color, float paintWidth) {
		super(x, y, color, paintWidth);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void draw(Canvas canvas) {
		// TODO Auto-generated method stub
		//canvas.drawCircle(mRectangle.left,mRectangle.top, Math.min(Math.abs(mRectangle.bottom-mRectangle.top), Math.abs(mRectangle.right-mRectangle.left)), mPaint);
		
		/*mRound.right = x;
		mRound.bottom = y;*/
		if (mRectangle.width() > mRectangle.height()) {
			mRectangle.right = mRectangle.left + mRectangle.height();
			canvas.drawOval(mRectangle, mPaint);
		}
		if (mRectangle.width() <= mRectangle.height()) {
			mRectangle.bottom = mRectangle.top + mRectangle.width();
			canvas.drawOval(mRectangle, mPaint);
		}
	}

}

/Painter3/src/com/wupic/painter/ColorPicker.java(这个类网上找的)

import android.app.Dialog;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;

public class ColorPicker extends Dialog {
        private final boolean debug = true;
        private final String TAG = "ColorPicker";
        
        Context context;
        private String title;//标题
        private int mInitialColor;//初始颜色
    private OnColorChangedListener mListener;

        /**
     * 初始颜色黑色
     * @param context
     * @param title 对话框标题
     * @param listener 回调
     */
    public ColorPicker(Context context, String title, 
                    OnColorChangedListener listener) {
            this(context, Color.BLACK, title, listener);
    }
    
    /**
     * 
     * @param context
     * @param initialColor 初始颜色
     * @param title 标题
     * @param listener 回调
     */
    public ColorPicker(Context context, int initialColor, 
                    String title, OnColorChangedListener listener) {
        super(context);
        this.context = context;
        mListener = listener;
        mInitialColor = initialColor;
        this.title = title;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WindowManager manager = getWindow().getWindowManager();
                int height = (int) (manager.getDefaultDisplay().getHeight() * 0.9f);
                int width = (int) (manager.getDefaultDisplay().getWidth() * 0.7f);
                ColorPickerView myView = new ColorPickerView(context, height, width);
        setContentView(myView);
        setTitle(title);
    }
    
    private class ColorPickerView extends View {
            private Paint mPaint;//渐变色环画笔
            private Paint mCenterPaint;//中间圆画笔
            private Paint mLinePaint;//分隔线画笔
            private Paint mRectPaint;//渐变方块画笔
            
            private Shader rectShader;//渐变方块渐变图像
            private float rectLeft;//渐变方块左x坐标
            private float rectTop;//渐变方块右x坐标
            private float rectRight;//渐变方块上y坐标
            private float rectBottom;//渐变方块下y坐标
        
            private final int[] mCircleColors;//渐变色环颜色
            private final int[] mRectColors;//渐变方块颜色
            
            private int mHeight;//View高
            private int mWidth;//View宽
            private float r;//色环半径(paint中部)
            private float centerRadius;//中心圆半径
            
            private boolean downInCircle = true;//按在渐变环上
            private boolean downInRect;//按在渐变方块上
            private boolean highlightCenter;//高亮
            private boolean highlightCenterLittle;//微亮
            
                public ColorPickerView(Context context, int height, int width) {
                        super(context);
                        this.mHeight = height - 36;
                        this.mWidth = width;
                        setMinimumHeight(height - 36);
                        setMinimumWidth(width);
                        
                        //渐变色环参数
                    mCircleColors = new int[] {0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 
                                    0xFF00FFFF, 0xFF00FF00,0xFFFFFF00, 0xFFFF0000};
                    Shader s = new SweepGradient(0, 0, mCircleColors, null);
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(s);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(50);
            r = width / 2 * 0.7f - mPaint.getStrokeWidth() * 0.1f;
            
            //中心圆参数
            mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mCenterPaint.setColor(mInitialColor);
            mCenterPaint.setStrokeWidth(5);
            centerRadius = (r - mPaint.getStrokeWidth() / 2 ) * 0.7f;
            
            //边框参数
            mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mLinePaint.setColor(Color.parseColor("#72A1D1"));
            mLinePaint.setStrokeWidth(4);
            
            //黑白渐变参数
            mRectColors = new int[]{0xFF000000, mCenterPaint.getColor(), 0xFFFFFFFF};
            mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mRectPaint.setStrokeWidth(5);
            rectLeft = -r - mPaint.getStrokeWidth() * 0.5f;
            rectTop = r + mPaint.getStrokeWidth() * 0.5f + 
                            mLinePaint.getStrokeMiter() * 0.5f + 15;
            rectRight = r + mPaint.getStrokeWidth() * 0.5f;
            rectBottom = rectTop + 50;
                }

                @Override
                protected void onDraw(Canvas canvas) {
                        //移动中心
            canvas.translate(mWidth / 2, mHeight / 2 - 50);
            //画中心圆
            canvas.drawCircle(0, 0, centerRadius,  mCenterPaint);
            //是否显示中心圆外的小圆环
            if (highlightCenter || highlightCenterLittle) {
                int c = mCenterPaint.getColor();
                mCenterPaint.setStyle(Paint.Style.STROKE);
                if(highlightCenter) {
                        mCenterPaint.setAlpha(0xFF);
                }else if(highlightCenterLittle) {
                        mCenterPaint.setAlpha(0x90);
                }
                canvas.drawCircle(0, 0, 
                                centerRadius + mCenterPaint.getStrokeWidth(),  mCenterPaint);
                
                mCenterPaint.setStyle(Paint.Style.FILL);
                mCenterPaint.setColor(c);
            }
            //画色环
            canvas.drawOval(new RectF(-r, -r, r, r), mPaint);
            //画黑白渐变块
            if(downInCircle) {
                    mRectColors[1] = mCenterPaint.getColor();
            }
            rectShader = new LinearGradient(rectLeft, 0, rectRight, 0, mRectColors, null, Shader.TileMode.MIRROR);
            mRectPaint.setShader(rectShader);
            canvas.drawRect(rectLeft, rectTop, rectRight, rectBottom, mRectPaint);
            float offset = mLinePaint.getStrokeWidth() / 2;
            canvas.drawLine(rectLeft - offset, rectTop - offset * 2, 
                            rectLeft - offset, rectBottom + offset * 2, mLinePaint);//左
            canvas.drawLine(rectLeft - offset * 2, rectTop - offset, 
                            rectRight + offset * 2, rectTop - offset, mLinePaint);//上
            canvas.drawLine(rectRight + offset, rectTop - offset * 2, 
                            rectRight + offset, rectBottom + offset * 2, mLinePaint);//右
            canvas.drawLine(rectLeft - offset * 2, rectBottom + offset, 
                            rectRight + offset * 2, rectBottom + offset, mLinePaint);//下
                        super.onDraw(canvas);
                }
                
                @Override
                public boolean onTouchEvent(MotionEvent event) {
                        float x = event.getX() - mWidth / 2;
            float y = event.getY() - mHeight / 2 + 50;
            boolean inCircle = inColorCircle(x, y, 
                            r + mPaint.getStrokeWidth() / 2, r - mPaint.getStrokeWidth() / 2);
            boolean inCenter = inCenter(x, y, centerRadius);
            boolean inRect = inRect(x, y);
            
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                        downInCircle = inCircle;
                        downInRect = inRect;
                        highlightCenter = inCenter;
                case MotionEvent.ACTION_MOVE:
                        if(downInCircle && inCircle) {//down按在渐变色环内, 且move也在渐变色环内
                                float angle = (float) Math.atan2(y, x);
                        float unit = (float) (angle / (2 * Math.PI));
                        if (unit < 0) {
                            unit += 1;
                        }
                                       mCenterPaint.setColor(interpCircleColor(mCircleColors, unit));
                                       if(debug) Log.v(TAG, "色环内, 坐标: " + x + "," + y);
                        }else if(downInRect && inRect) {//down在渐变方块内, 且move也在渐变方块内
                                mCenterPaint.setColor(interpRectColor(mRectColors, x));
                        }
                        if(debug) Log.v(TAG, "[MOVE] 高亮: " + highlightCenter + "微亮: " + highlightCenterLittle + " 中心: " + inCenter);
                        if((highlightCenter && inCenter) || (highlightCenterLittle && inCenter)) {//点击中心圆, 当前移动在中心圆
                                highlightCenter = true;
                                highlightCenterLittle = false;
                        } else if(highlightCenter || highlightCenterLittle) {//点击在中心圆, 当前移出中心圆
                                highlightCenter = false;
                                highlightCenterLittle = true;
                        } else {
                                highlightCenter = false;
                                highlightCenterLittle = false;
                        }
                           invalidate();
                        break;
                case MotionEvent.ACTION_UP:
                        if(highlightCenter && inCenter) {//点击在中心圆, 且当前启动在中心圆
                                if(mListener != null) {
                                        mListener.colorChanged(mCenterPaint.getColor());
                                    ColorPicker.this.dismiss();
                                }
                        }
                        if(downInCircle) {
                                downInCircle = false;
                        }
                        if(downInRect) {
                                downInRect = false;
                        }
                        if(highlightCenter) {
                                highlightCenter = false;
                        }
                        if(highlightCenterLittle) {
                                highlightCenterLittle = false;
                        }
                        invalidate();
                    break;
            }
            return true;
                }

                @Override
                protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                        super.onMeasure(mWidth, mHeight);
                }

                /**
                 * 坐标是否在色环上
                 * @param x 坐标
                 * @param y 坐标
                 * @param outRadius 色环外半径
                 * @param inRadius 色环内半径
                 * @return
                 */
                private boolean inColorCircle(float x, float y, float outRadius, float inRadius) {
                        double outCircle = Math.PI * outRadius * outRadius;
                        double inCircle = Math.PI * inRadius * inRadius;
                        double fingerCircle = Math.PI * (x * x + y * y);
                        if(fingerCircle < outCircle && fingerCircle > inCircle) {
                                return true;
                        }else {
                                return false;
                        }
                }
                
                /**
                 * 坐标是否在中心圆上
                 * @param x 坐标
                 * @param y 坐标
                 * @param centerRadius 圆半径
                 * @return
                 */
                private boolean inCenter(float x, float y, float centerRadius) {
                        double centerCircle = Math.PI * centerRadius * centerRadius;
                        double fingerCircle = Math.PI * (x * x + y * y);
                        if(fingerCircle < centerCircle) {
                                return true;
                        }else {
                                return false;
                        }
                }
                
                /**
                 * 坐标是否在渐变色中
                 * @param x
                 * @param y
                 * @return
                 */
                private boolean inRect(float x, float y) {
                        if( x <= rectRight && x >=rectLeft && y <= rectBottom && y >=rectTop) {
                                return true;
                        } else {
                                return false;
                        }
                }
                
                /**
                 * 获取圆环上颜色
                 * @param colors
                 * @param unit
                 * @return
                 */
            private int interpCircleColor(int colors[], float unit) {
            if (unit <= 0) {
                return colors[0];
            }
            if (unit >= 1) {
                return colors[colors.length - 1];
            }
            
            float p = unit * (colors.length - 1);
            int i = (int)p;
            p -= i;

            // now p is just the fractional part [0...1) and i is the index
            int c0 = colors[i];
            int c1 = colors[i+1];
            int a = ave(Color.alpha(c0), Color.alpha(c1), p);
            int r = ave(Color.red(c0), Color.red(c1), p);
            int g = ave(Color.green(c0), Color.green(c1), p);
            int b = ave(Color.blue(c0), Color.blue(c1), p);
            
            return Color.argb(a, r, g, b);
        }
                
                /**
                 * 获取渐变块上颜色
                 * @param colors
                 * @param x
                 * @return
                 */
                private int interpRectColor(int colors[], float x) {
                        int a, r, g, b, c0, c1;
                float p;
                if (x < 0) {
                        c0 = colors[0]; 
                        c1 = colors[1];
                        p = (x + rectRight) / rectRight;
                } else {
                        c0 = colors[1];
                        c1 = colors[2];
                        p = x / rectRight;
                }
                a = ave(Color.alpha(c0), Color.alpha(c1), p);
                r = ave(Color.red(c0), Color.red(c1), p);
                g = ave(Color.green(c0), Color.green(c1), p);
                b = ave(Color.blue(c0), Color.blue(c1), p);
                return Color.argb(a, r, g, b);
                }
                
                private int ave(int s, int d, float p) {
            return s + Math.round(p * (d - s));
        }
    }
    
    /**
     * 回调接口
     * @author <a href="clarkamx@gmail.com">LynK</a>
     * 
     * Create on 2012-1-6 上午8:21:05
     *
     */
    public interface OnColorChangedListener {
            /**
             * 回调函数
             * @param color 选中的颜色
             */
        void colorChanged(int color);
    }
    
    public String getTitle() {
                return title;
        }

        public void setTitle(String title) {
                this.title = title;
        }

        public int getmInitialColor() {
                return mInitialColor;
        }

        public void setmInitialColor(int mInitialColor) {
                this.mInitialColor = mInitialColor;
        }

        public OnColorChangedListener getmListener() {
                return mListener;
        }

        public void setmListener(OnColorChangedListener mListener) {
                this.mListener = mListener;
        }
}

/Painter3/src/com/wupic/painter/Curve.java

import java.util.ArrayList;
import java.util.List;

import android.graphics.Canvas;
import android.graphics.EmbossMaskFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.graphics.RectF;

public class Curve extends Shape {
	private List<PointF> mPoints;
	/** 绘制路径 */
	protected Path mPath;

	/**
	 * @param x 起点横坐标
	 * @param y 起点纵坐标
	 * @param color 笔刷颜色
	 * @param paintWidth 笔刷粗细
	 */
	public Curve(float x, float y, int color, float paintWidth) {
		super(x, y, color, paintWidth);
		mPoints = new ArrayList<PointF>();
		PointF point = new PointF(x, y);
		mPoints.add(point);
		mPath = new Path();

	}

	@Override
	public void setEndPoint(float x, float y) {
		super.setEndPoint(x, y);
		PointF point = new PointF(x, y);
		mPoints.add(point);
	}

	@Override
	public void draw(Canvas canvas) {
		mPath.rewind();
		mPath.moveTo(mPoints.get(0).x, mPoints.get(0).y);
		for (PointF point : mPoints) {
			mPath.lineTo(point.x, point.y);
		}
		canvas.drawPath(mPath, mPaint);
	}
}

/Painter3/src/com/wupic/painter/Ellipse.java

import android.graphics.Canvas;

public class Ellipse extends Shape {

	public Ellipse(float x, float y, int color, float paintWidth) {
		super(x, y, color, paintWidth);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void draw(Canvas canvas) {
		// TODO Auto-generated method stub
		canvas.drawOval(mRectangle, mPaint);
	}

}

/Painter3/src/com/wupic/painter/Erease.java

import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;

public class Erease extends Curve {

	public Erease(float x, float y, int color, float paintWidth) {
		super(x, y, color, paintWidth);
		// TODO Auto-generated constructor stub
		mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
	}

}

/Painter3/src/com/wupic/painter/PaintView.java

import java.util.Iterator;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.View;


public class PaintView extends View {

	/**
	 * @param context
	 */
	Bitmap mBitmap;
	Canvas mCanvas;
	public PaintView(Context context) {
		super(context);
	}

	/**
	 * @param context
	 * @param attrs
	 */
	public PaintView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	/**
	 * @param context
	 * @param attrs
	 * @param defStyle
	 */
	public PaintView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		if(mBitmap==null){
			mBitmap=Bitmap.createBitmap(getMeasuredWidth(),getMeasuredHeight(),Bitmap.Config.ARGB_8888);
			mCanvas=new Canvas(mBitmap);
		}
		mCanvas.drawColor(Color.WHITE);
		Iterator<Shape> iterator = ShapeManager.getInstance().getShapesIterator();
		while (iterator.hasNext()) {
			Shape shape = iterator.next();
			shape.draw(mCanvas);
		}
		canvas.drawBitmap(mBitmap, 0, 0,null);
	}

}

/Painter3/src/com/wupic/painter/Rectangle.java

import android.graphics.Canvas;


public class Rectangle extends Shape {

	/**
	 * @param x
	 * @param y
	 * @param color
	 * @param paintWidth
	 */
	public Rectangle(float x, float y, int color, float paintWidth) {
		super(x, y, color, paintWidth);
	}

	/* (non-Javadoc)
	 * @see com.wupic.painter.Shape#draw(android.graphics.Canvas)
	 */
	@Override
	public void draw(Canvas canvas) {
		canvas.drawRect(mRectangle, mPaint);
	}

}

/Painter3/src/com/wupic/painter/Shape.java

import android.graphics.Canvas;
import android.graphics.CornerPathEffect;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.RectF;


public abstract class Shape {
	/** 图形的范围 */
	protected RectF mRectangle;
	/** 笔刷 */
	protected Paint mPaint;
	/**
	 * @param x 起点横坐标
	 * @param y 起点纵坐标
	 * @param color 笔刷颜色
	 * @param paintWidth 笔刷粗细
	 */
	public Shape(float x, float y, int color, float paintWidth) {
		/*mRectangle = new RectF(x, y, x, y);
		mPaint = new Paint();
		mPaint.setColor(color);
		mPaint.setStrokeWidth(paintWidth);
		mPaint.setStyle(Style.STROKE);
		mPaint.setAntiAlias(true);
		mPaint.setPathEffect(new CornerPathEffect(10));
		mPaint.getMaskFilter();*/
		
		mRectangle = new RectF(x, y, x, y);
		mPaint = new Paint();
		mPaint.setColor(color);
		mPaint.setStrokeWidth(paintWidth);
		mPaint.setStyle(Style.STROKE);
	}

	/**
	 * 设置终点
	 * @param x 终点横坐标
	 * @param y 终点纵坐标
	 */
	public void setEndPoint(float x, float y) {
		mRectangle.right = x;
		mRectangle.bottom = y;
	}

	/**
	 * 绘制
	 * @param canvas 画布
	 */
	public abstract void draw(Canvas canvas);
}

/Painter3/src/com/wupic/painter/ShapeManager.java

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 图形管理器
 */
public class ShapeManager {
	private List<Shape> mShapes;
	private static ShapeManager instance;

	private ShapeManager(){
		mShapes = new ArrayList<Shape>();
	};

	/**
	 * 获得实例方法
	 * @return
	 */
	public static ShapeManager getInstance() {
		if (instance == null) {
			instance = new ShapeManager();
		}
		return instance;
	}

	/**
	 * 获得图形list的迭代器
	 * @return
	 */
	public Iterator<Shape> getShapesIterator() {
		return mShapes.iterator();
	}

	/**
	 * 增加一个图形
	 * @param shape
	 */
	public void addShape(Shape shape) {
		mShapes.add(shape);
	}

	/**
	 * 清空所有图形
	 */
	public void clearShapes() {
		mShapes.clear();
	}
}

/Painter3/src/com/wupic/painter/Teragonal.java

import android.graphics.Canvas;

public class Teragonal extends Shape {

	public Teragonal(float x, float y, int color, float paintWidth) {
		super(x, y, color, paintWidth);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void draw(Canvas canvas) {
		// TODO Auto-generated method stub
		/*if(Math.abs(mRectangle.bottom-mRectangle.top)!=Math.abs(mRectangle.right-mRectangle.left))
		{
			int min=(int) Math.min(Math.abs(mRectangle.bottom-mRectangle.top), Math.abs(mRectangle.right-mRectangle.left));
			mRectangle.bottom=mRectangle.top+min;
			mRectangle.right=mRectangle.left+min;
			canvas.drawRect(mRectangle, mPaint);
		}*/
		
		
		if (mRectangle.width() > mRectangle.height()) {
			mRectangle.right = mRectangle.left + mRectangle.height();
			canvas.drawRect(mRectangle, mPaint);
		}
		if (mRectangle.width() <= mRectangle.height()) {
			mRectangle.bottom = mRectangle.top + mRectangle.width();
			canvas.drawRect(mRectangle, mPaint);
		}
		
	}

}

/Painter3/src/com/wupic/painter/MainActivity.java

import android.app.Activity;
import android.content.Context;
import android.graphics.BlurMaskFilter;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;

public class MainActivity extends Activity {
	private Spinner mShapes;
	private Spinner mColors;
	private Spinner mWidths;
	private Button mClearButton;
	private PaintView mCanvas;
	private Button btnColor;
	Context context ;
	/** 当前正在绘制的图形 */
	private Shape mCurrentShape;
	private ColorPicker dialog;
    
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		context = this;
		initView();
		setupSpinners();
		setupListeners();
	}

	/**
	 * 初始化界面元素
	 */
	private void initView() {
		mShapes = (Spinner) findViewById(R.id.sp_shape);
		mColors = (Spinner) findViewById(R.id.sp_color);
		mWidths = (Spinner) findViewById(R.id.sp_width);
		mClearButton = (Button) findViewById(R.id.btn_clear);
		mCanvas = (PaintView) findViewById(R.id.pv_canvas);
		btnColor=(Button)findViewById(R.id.btn_color);
		mCanvas.setBackgroundColor(Color.WHITE);
	}

	/**
	 * 设置下拉框数据
	 */
	private void setupSpinners() {
		ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
				this, R.array.shapes, android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		mShapes.setAdapter(adapter);

		adapter = ArrayAdapter.createFromResource(this, R.array.colors, android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		mColors.setAdapter(adapter);

		adapter = ArrayAdapter.createFromResource(this, R.array.widths, android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		mWidths.setAdapter(adapter);
	}

	/**
	 * 设置监听器
	 */


	private void setupListeners() {
		mClearButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				ShapeManager.getInstance().clearShapes();
				mCanvas.invalidate();
			}
		});

		btnColor.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				dialog = new ColorPicker(context, 0, 
                         getResources().getString(R.id.btn_color), 
                         new ColorPicker.OnColorChangedListener() {
							@Override
							public void colorChanged(int color) {
								// TODO Auto-generated method stub
								btnColor.setTextColor(color);
							}
				});
				dialog.show();
			}
		});
		mCanvas.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					addShape(event.getX(), event.getY());
					break;
				case MotionEvent.ACTION_MOVE:
					mCurrentShape.setEndPoint(event.getX(), event.getY());
					mCanvas.invalidate();
					break;
				default:
					break;
				}
				return true;
			}
		});
	}

	/**
	 * 增加一个图形
	 * @param x
	 * @param y
	 */
	private void addShape(float x, float y) {
		int color=btnColor.getCurrentTextColor();
		float paintWidth = 0;
		
		switch (mWidths.getSelectedItemPosition()) {
		case 0:
			paintWidth = 2f;
			break;
		case 1:
			paintWidth = 5f;
			break;
		case 2:
			paintWidth = 8f;
			break;
		default:
			paintWidth = 2f;
			break;
		}
		
		
		switch (mColors.getSelectedItemPosition()) {
		case 0:
			break;
		case 1:
			color = Color.RED;
			break;
		case 2:
			mCurrentShape.mPaint.setMaskFilter(new BlurMaskFilter(8,BlurMaskFilter.Blur.NORMAL));
			break;
		case 3:
			mCurrentShape.mPaint.setMaskFilter(new EmbossMaskFilter(new float[]{1,1,1},0.4f,6,3.5f));
			break;
		default:
			color = Color.BLACK;
			break;
		}
		
		
		switch (mShapes.getSelectedItemPosition()) {
		case 0:
			mCurrentShape = new Curve(x, y, color, paintWidth);
			break;
		case 1:
			mCurrentShape = new Rectangle(x, y, color, paintWidth);
			break;
		case 2:
			mCurrentShape=new Ellipse(x, y, color, paintWidth);
			break;
		case 3:
			mCurrentShape=new Teragonal(x, y, color, paintWidth);
			break;
		case 4:
			mCurrentShape=new Circle(x, y, color, paintWidth);
			break;
		case 5:
			mCurrentShape=new Erease(x, y, color, paintWidth);
			break;
		default:
			mCurrentShape = new Curve(x, y, color, paintWidth);
			break;
		}
		
		ShapeManager.getInstance().addShape(mCurrentShape);
	}

}
程序被安装在虚拟机上

小画板运行效果

色板选择自己喜欢的颜色
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值