Java Android绘图应用程序中的MVC模式

Java Android绘图应用程序中的MVC模式,java,android,Java,Android,我正在开发用于绘图的Android应用程序。所以,我需要使用MVC模式。我有应用程序用于绘图的视图类: public class PainterView extends View implements DrawingListener { private Painter painter; private Bitmap bitmap; private Paint bitmapPaint; private Path path; private Paint p

我正在开发用于绘图的Android应用程序。所以,我需要使用MVC模式。我有应用程序用于绘图的视图类:

public class PainterView extends View implements DrawingListener {

    private Painter painter;

    private Bitmap bitmap;
    private Paint bitmapPaint;
    private Path path;
    private Paint paint;

    public PainterView(Context context, Painter painter) {

        super(context);
        this.painter=painter;
        this.painter.addDrawingListener(this);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        if (bitmap!=null) {
            canvas.drawBitmap(bitmap, 0, 0, bitmapPaint);
            canvas.drawPath(path, paint);
        } 
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                painter.touchStart(x, y);
                break;
            case MotionEvent.ACTION_MOVE:
                painter.touchMove(x, y);
                break;
            case MotionEvent.ACTION_UP:
                painter.touchUp();
                break;
        }

        return true;
    }

    @Override
    public void update(Bitmap bitmap, Paint bitmapPaint, Path path, Paint paint) {

        this.bitmap=bitmap;
        this.bitmapPaint=bitmapPaint;
        this.path=path;
        this.paint=paint;
        invalidate();
    }
}
主要活动:

public class MainScreenActivity extends Activity {
    /** Called when the activity is first created. */
    private PainterView mMainView;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Display display = getWindow().getWindowManager().getDefaultDisplay();
        Painter painter=new Painter(display.getWidth(), display.getHeight());
        mMainView = new PainterView(this, painter);
        setContentView(mMainView);
    }
}
以及保存所有算法(模型)的Painter类。请注意,所有算法都很有效:

public class Painter {

    private List<DrawingListener> mDrawingListeners;

    private static final float TOUCH_TOLERANCE = 4;
    private static final float MINP = 0.25f;
    private static final float MAXP = 0.75f;

    public Paint mPaint;
    public Bitmap mBitmap;
    public Canvas mCanvas;
    public Path mPath;
    public Paint mBitmapPaint;

    private float mX, mY;

    public Painter(int width, int height) {
        initializeGraphic(width, height);
    }

    private void initializeGraphic(int width, int height) {

        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(0xFFFF0000);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);

        mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);
        mPath = new Path();
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);

        mCanvas.drawRect(new Rect(0, 0, width, height), new Paint(Color.BLACK));
    }

    private void drawingChanged() {
        notifyDrawingListeners();
    }

    public void touchStart(float x, float y) {
        Log.e("event", "start");
        mPath.reset();
        mPath.moveTo(x, y);
        mX = x;
        mY = y;
        drawingChanged();
    }

    public void touchMove(float x, float y) {
        Log.e("event", "move");
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
            mX = x;
            mY = y;
        }
        drawingChanged();
    }

    public void touchUp() {
        Log.e("event", "up");
        mPath.lineTo(mX, mY);
        mCanvas.drawPath(mPath, mPaint);
        mPath.reset();
        drawingChanged();
    }

    public void addDrawingListener(DrawingListener listener) {
        if (mDrawingListeners==null) {
            mDrawingListeners=new ArrayList<DrawingListener>();
        }
        mDrawingListeners.add(listener);
    }   

    public void removeDrawingListener(DrawingListener listener) {
        mDrawingListeners.remove(listener);
    }

    public void notifyDrawingListeners() {

        for (DrawingListener listener:mDrawingListeners) {
            listener.update(mBitmap, mBitmapPaint, mPath, mPaint);
        }
    }
}

那就行了!但我不明白为什么!应用程序使用相同的链接,为什么我需要在绘图后再次更改它?多谢各位

Android隐式遵循
MVC
模式,所以您不必麻烦


Android隐式遵循
MVC
模式,所以您无需费心


这个答案对提问者的需求肯定没有建设性。告诉他/她不要做他们显然需要做的事情会适得其反。此外,你所链接到的问题,尽管被接受的答案做出了这样的断言,但仍引起了激烈的争论。事实上,答案中的相反意见的评级高于实际答案。我会考虑回复你的答案来解决OPS的实际需要。这个回答对提问者的需求当然不是有建设性的。告诉他/她不要做他们显然需要做的事情会适得其反。此外,你所链接到的问题,尽管被接受的答案做出了这样的断言,但仍引起了激烈的争论。事实上,答案中的相反意见的评级高于实际答案。我会考虑你的答案来解决OPS的实际需要。
@Override
protected void onDraw(Canvas canvas) {

    if (bitmap!=null) {
        canvas.drawBitmap(bitmap, 0, 0, bitmapPaint);
        canvas.drawPath(path, paint);
        painter.mBitmap=bitmap;
        painter.mBitmapPaint=bitmapPaint;
        painter.mPaint=paint;
        painter.mPath=path;
    } 
}