zoukankan      html  css  js  c++  java
  • java引入Android NinePatch技术的意义

    java与Android本署一个平台。大部分技术可以移植。在java标准平台中引入Android NinePatch技术可以使其UI设计大大得到改善:

    图片准备:

    Android NinePatch技术介绍:http://developer.android.com/tools/help/draw9patch.html

    附NinePatch jar包下载:http://download.csdn.net/detail/gaowen_han/5204821

    应用NinePatch技术代码:

    package com.han;
    
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    import com.android.ninepatch.NinePatch;
    
    @SuppressWarnings("serial")
    public class NinePatchTest extends JPanel {
    	NinePatch ninePatch;
    
    	/**
    	 * This constructor which serves as a content pane uses a default flow
    	 * layout and a double-buffering strategy.
    	 */
    	public NinePatchTest() {
    		ninePatch = loadNinePatch("/images/content_bg1.9.png");
    
    		add(new JButton("Button 1"));
    		add(new JButton("Button 2"));
    		add(new JButton("Button 3"));
    		add(new JButton("Button 4"));
    	}
    
    	/**
    	 * @param path
    	 *            - the image path.
    	 * @return an NinePatch object, or {@code null} if the given path is not
    	 *         valid or an error occurs during loading.
    	 */
    	private NinePatch loadNinePatch(String path) {
    		InputStream stream = this.getClass().getResourceAsStream(path);
    		if (stream != null) {
    			try {
    				return NinePatch.load(stream, true, false);
    			} catch (IOException e) {
    				System.err.println("An error occurs during loading.");
    				e.printStackTrace();
    				return null;
    			}
    		} else {
    			System.err.println("Couldn't find the file: " + path);
    			return null;
    		}
    	}
    
    	/**
    	 * To improve the repaint speed, the code block contained in
    	 * paintComponent() must be able to be executed quickly. For example, we
    	 * usually put the load image code out of the paintComponent() for rapid UI
    	 * update.
    	 * 
    	 * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
    	 */
    	@Override
    	protected void paintComponent(Graphics g) {
    		Graphics2D g2 = (Graphics2D) g;
    		Rectangle clip = g2.getClipBounds();
    		ninePatch.draw(g2, clip.x, clip.y, clip.width, clip.height);
    	}
    
    	private static void createAndShowGUI() {
    		// Create and set up the window.
    		JFrame frame = new JFrame("NinePatch test");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    		// Set up the content pane.
    		JPanel contentPane = new NinePatchTest();
    		contentPane.setOpaque(true); // content pane must be opaque
    		contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    		frame.setContentPane(contentPane);
    
    		// Display the window.
    		frame.pack();
    		frame.setVisible(true);
    	}
    
    	public static void main(String[] args) {
    		// Schedule a job for the EDT:
    		// Creating and showing this application's GUI.
    		SwingUtilities.invokeLater(new Runnable() {
    
    			@Override
    			public void run() {
    				createAndShowGUI();
    			}
    
    		});
    	}
    
    }
    

    利用后2幅图(格式.9.png)得到如下效果:


    如果使用传统的双线性插值进行图像缩放,我们来对比下效果:

    双线性插值应用代码:

    package com.han;
    
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.RenderingHints;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.imageio.ImageIO;
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    @SuppressWarnings("serial")
    public class NinePatchTestForCompare extends JPanel {
    	BufferedImage image;
    
    	/**
    	 * This constructor uses a default flow layout and a double-buffering
    	 * strategy.
    	 */
    	public NinePatchTestForCompare() {
    		image = loadImage("/images/content_bg2.png");
    
    		add(new JButton("Button 1"));
    		add(new JButton("Button 2"));
    		add(new JButton("Button 3"));
    		add(new JButton("Button 4"));
    	}
    
    	/**
    	 * @param path
    	 *            - the image path.
    	 * @return an BufferedImage object, or {@code null} if the given path is not
    	 *         valid or an error occurs during loading.
    	 */
    	private BufferedImage loadImage(String path) {
    		InputStream stream = this.getClass().getResourceAsStream(path);
    		if (stream != null) {
    			try {
    				return ImageIO.read(stream);
    			} catch (IOException e) {
    				System.err.println("An error occurs during loading.");
    				e.printStackTrace();
    				return null;
    			}
    		} else {
    			System.err.println("Couldn't find the file: " + path);
    			return null;
    		}
    	}
    
    	@Override
    	protected void paintComponent(Graphics g) {
    		Graphics2D g2 = (Graphics2D) g;
    		Rectangle clip = g2.getClipBounds();
    		g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
    				RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    		g2.drawImage(image, clip.x, clip.y, clip.width, clip.height, null);
    	}
    
    	private static void createAndShowGUI() {
    		// Create and set up the window.
    		JFrame frame = new JFrame("NinePatchTestForCompare");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    		// Set up the content pane.
    		JPanel contentPane = new NinePatchTestForCompare();
    		contentPane.setOpaque(true); // content pane must be opaque
    		contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    		frame.setContentPane(contentPane);
    
    		// Display the window.
    		frame.pack();
    		frame.setVisible(true);
    	}
    
    	public static void main(String[] args) {
    		// Schedule a job for the EDT:
    		// Creating and showing this application's GUI.
    		SwingUtilities.invokeLater(new Runnable() {
    
    			@Override
    			public void run() {
    				createAndShowGUI();
    			}
    
    		});
    	}
    
    }
    


    使用的前2幅图(格式.png),效果如下:


    不用我多说,就可以看出NinePatch技术的优势了。

  • 相关阅读:
    Git的安装与配置
    JDBCTemplate
    消费金融大数据风控架构
    架构设计之道
    面向服务架构SOA
    java集合List解析
    web应用安全
    微服务的交互模式
    服务化管理和治理框架的技术选型
    分库分表就能无限扩容么?
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2992104.html
Copyright © 2011-2022 走看看