这套框架终于到了完结篇了,这篇就算是整个框架的重点了,涉及的不仅是重做和撤销功能,更重要的是牵扯整个框架的架构。
之前我们实现的功能是添加图片和用画笔绘画,我们的做法是在一个自定义的PaintLayout上添加一个类似于自定义画布那样的去盛放画笔画出来的东西,再在PaintLayout上添加图片,这样做的不好之处在于各个类之间的功能不明确,现在把项目重新架构成把图片全部集成到另外一个自定义的ViewLayout上,把ViewLayout加载到PaintLayout上,再放上盛放画笔画出的View,也就是TopLayer,在PaintLayout上用两个链表去实现重做和撤销操作。
我们先看一下ViewLayout的实现。
这里的ViewLayout其实就是把第一节的PaintLayout稍微改改,但是在这里得通知外层修改链表,所有还得定义个接口,这里就直接贴代码了
public class ViewLayout extends FrameLayout{
public interface ViewListener{
void addView(PaintView paintView);
void deleteView(PaintView paintView);
}
private Context context;
private LayoutParams params;
private ViewListener viewListener;
private boolean canInit=false;
public ViewLayout(Context context,ViewListener viewListener) {
super(context);
this.context=context;
this.viewListener=viewListener;
params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
private void addView(MotionEvent event){
PaintView paintView=new PaintView(context, (int) event.getX(), (int) event.getY(), new PaintView.OnEnableListener() {
@Override
public void callback(PaintView stampView) {
for (int i = 0; i < ViewLayout.this.getChildCount(); ++i) {
if (ViewLayout.this.getChildAt(i) != stampView) {
((PaintView) ViewLayout.this.getChildAt(i)).setViewEnable(false);
}
}
}
@Override
public void onDelete(PaintView stampView) {
stampView.setVisibility(GONE);
viewListener.deleteView(stampView);
}
});
this.addView(paintView,params);
viewListener.addView(paintView);
}
@Override
public