情况一:
① IDraw Interface
public interface IDraw {
void doDraw(Canvas canvas);
}
② GraphView extends View
public class GraphView extends View{
private IDraw fgDrawer;
public GraphView(Context context) {
super(context);
fgDrawer=(IDraw)context;//(interface)context什么来的?
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.drawBackground(canvas);
fgDrawer.doDraw(canvas);//##关键语句##
}
protected void drawBackground(Canvas canvas) {
canvas.drawColor(Color.WHITE);
}
}
③ myView extends GraphView
public class myView extends GraphView {
private Bitmap bmp;
private Paint paint=new Paint();
public myView(Context context,Bitmap bitmap) {
super(context);
bmp=bitmap;
}
//覆写父类GraphView的drawBackground方法而已
//父类在onDraw中调用了,所以在mainActivity中不见mv.drawBackground这样调用
@Override
protected void drawBackground(Canvas canvas) {
super.drawBackground(canvas);
canvas.drawBitmap(bmp, 0,0, paint);
}
}
public class MainActivity extends Activity implements IDraw {
private GraphView mv;
private Paint paint=new Paint();
private Bitmap bmp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bmp=BitmapFactory.decodeResource(getResources(), R.drawable.purple);
mv=new myView(this,bmp);
LinearLayout layout=new LinearLayout(this);
LayoutParams lp=new LayoutParams(250,250);
lp.topMargin=10;
lp.leftMargin=10;
layout.addView(mv,lp);
setContentView(layout);
}
@Override
public void doDraw(Canvas canvas) {
//画机器人
paint.setAntiAlias(true);
RectF rectF=new RectF(80,110,180,180);
paint.setColor(Color.GREEN);
canvas.drawArc(rectF, 220, 180, true, paint);
paint.setStrokeWidth(3);
canvas.drawLine(135, 120, 140, 75, paint);
canvas.drawLine(160, 140, 210, 130, paint);
paint.setColor(Color.WHITE);
canvas.drawCircle(128, 125, 6, paint);
canvas.drawCircle(162, 145, 6, paint);
}
}
⑤截图:
总结:这里所谓的框架就是GraphView这个类。 View->GraphView->myView,中间的GraphView就是我们的框架。
关键点一:GraphView中有句(IDraw)fgDrawer.doDraw(),然后在mainActivity中implements IDraw去实现具体内容,这块类似回调函数。
关键点二:myView覆写了GraphView中的drawBackground(),具体见注释。
-----------------------------------------
情况二:
① IDraw 接口
public interface IDraw {
void doDraw(Canvas canvas);
}
② GraphView
public class GraphView extends View {
private IDraw fgDrawer;//##关键语句##
public GraphView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.drawBackground(canvas);
fgDrawer.doDraw(canvas);
}
protected void drawBackground(Canvas canvas){
canvas.drawColor(Color.GRAY);
}
public void setForegroundDrawer(IDraw fgd){
fgDrawer=fgd;//##关键语句##
}
}
③ mainActivity.class
public class MainActivity extends Activity {
private GraphView mv=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout=new LinearLayout(this);
LayoutParams lp=new LayoutParams(250,280);
lp.topMargin=10;
lp.leftMargin=10;
mv=new GraphView(this);
layout.addView(mv,lp);
mv.setForegroundDrawer(new myDrawing_IDraw());//##关键语句##
setContentView(layout);
}
public class myDrawing_IDraw implements IDraw{
private Paint paint;
public myDrawing_IDraw(){
paint=new Paint();
}
@Override
public void doDraw(Canvas canvas) {
//画机器人
paint.setAntiAlias(true);
RectF rectF=new RectF(80,110,180,180);
paint.setColor(Color.GREEN);
canvas.drawArc(rectF, 220, 180, true, paint);
paint.setStrokeWidth(3);
canvas.drawLine(135, 120, 140, 75, paint);
canvas.drawLine(160, 140, 210, 130, paint);
paint.setColor(Color.WHITE);
canvas.drawCircle(128, 125, 6, paint);
canvas.drawCircle(162, 145, 6, paint);
}
}
}
④截图:
总结: 标准的Button--onClickListener类型,回调函数形式。