在说明牌视图以前,咱们先看下View的实现,代码以下:
java
/** * <p>Title: View.java</p> * <p>Description:视图基类 </p> * <p>Copyright: Copyright (c) 2007</p> * @author Tunie * @date 2014年9月18日 * @version 1.0 */ public abstract class View extends JPanel { /** */ private static final long serialVersionUID = 2671149288739472345L; @Override protected void paintComponent(Graphics g) { super.paintComponent(g); refresh(g); } protected abstract void refresh(Graphics g); }
View继承Jpanel并重写了paintComponent方法,新增了一个refresh抽象方法,这意味着所示继承了View的非抽象子类,必须实现该方法。至于为什么如此设计,我就不细说了,读者自行体会。
ide
如今咱们着重看一下CardView的refresh方法,其实现代码以下:设计
@Override protected void refresh(Graphics g) { calcImage(); Graphics2D g2d = (Graphics2D) g; g2d.drawImage(image, 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT, null); }
没有什么特别的,主要要细看calcImage方法,代码以下:code
private void calcImage() { image = new BufferedImage(DEFAULT_WIDTH, DEFAULT_HEIGHT, BufferedImage.TRANSLUCENT); Graphics2D graphics2d = image.createGraphics(); RoundRectangle2D rectangle2d = new RoundRectangle2D.Double(0, 0, DEFAULT_WIDTH-1, DEFAULT_HEIGHT-1 ,13 ,13); graphics2d.setColor(new Color(0xdddeee)); graphics2d.draw(rectangle2d); graphics2d.setColor(Color.white); RoundRectangle2D rectangle2d1 = new RoundRectangle2D.Double(0.5, 0.5, DEFAULT_WIDTH-2, DEFAULT_HEIGHT-2 ,12 ,12); graphics2d.fill(rectangle2d1); if(card.isNotKing()) { String cardColor = ColorType.getDescription(card.getColorType()) + ".png"; BufferedImage cardColorImage = AssertManager.getAssert(cardColor); int cardColorImageX = (DEFAULT_WIDTH - cardColorImage.getWidth())/2; int cardColorImageY = (DEFAULT_HEIGHT - cardColorImage.getHeight())/2; graphics2d.drawImage(cardColorImage, cardColorImageX, cardColorImageY, cardColorImage.getWidth(), cardColorImage.getHeight(), null); } int padding = 5; String type = card.getTypeImagePath(); BufferedImage typeImage = AssertManager.getAssert(type); graphics2d.drawImage(typeImage, padding, padding, typeImage.getWidth(), typeImage.getHeight(), null); String listtleCardColor = ColorType.getDescription(card.getColorType()) + "_little.png"; BufferedImage listtleCardColorImage = AssertManager.getAssert(listtleCardColor); int listtleCardColorImageX = padding + (typeImage.getWidth() - listtleCardColorImage.getWidth())/2; int listtleCardColorImageY = padding + typeImage.getHeight(); if(!card.isBigKing() && !card.isSmallKing() ) { graphics2d.drawImage(listtleCardColorImage, listtleCardColorImageX, listtleCardColorImageY, listtleCardColorImage.getWidth(), listtleCardColorImage.getHeight(), null); } graphics2d.translate(DEFAULT_WIDTH, DEFAULT_HEIGHT); graphics2d.rotate(Math.toRadians(180)); graphics2d.drawImage(typeImage, padding, padding, typeImage.getWidth(), typeImage.getHeight(), null); if(!card.isBigKing() && !card.isSmallKing() ) { graphics2d.drawImage(listtleCardColorImage, listtleCardColorImageX, listtleCardColorImageY, listtleCardColorImage.getWidth(), listtleCardColorImage.getHeight(), null); } }
看上去挺长的,其实重点在最后面的旋转绘制处理,这个点明白了,这张牌的视图实现就没有问题了。继承