일반적으로 자바와 안드로이드 자바는 자바라는 이름 하에서 비슷한 류라고 생각한다.
하지만 코딩의 방식은 다를 수 있다라는 생각이 들 수 있다
다음은 몇가지 변환에 대해서 생각 해 보기로 한다.
0. 전제조건 Graphics2D
다음은 전제 조건이다.
Graphics2D 객체인 g가 있고, Canvas 객체인 g가 있을 경우에 다음과 같이 사각형을 색칠 하려고 한다. 즉,
[Java] - java.awt.Graphics2D
Graphics2D g;
java.awt.Color color;
[Android Java]- android.graphics
Canvas g;
Paint Pnt = new Paint();
Color color = new color
1. 사각형 색칠하기
[Java]
g.setColor(new Color(0x4379B7));
g.fillRect(0, 0, width, height);
그럼 안드로이드 자바에서는? 다음 정도가 될려나..
[Android Java]
Pnt.setColor(0x4379B7);
g.drawRect(0, 0, width, height, Pnt);
2. 이미지 그리기 drawImage, drawBitmap
일반적으로 많이 자바에서 많이 사용하는 방식은 BufferedImage를 생성하여 여기에다 그리고 Graphics2D를 사용해서 그리는 데, 안드로이드 자바에서다 그닥 다르지 않다.
[Java] drawImage
g.drawImage(bitmaps.island, 0, 0, null);
[Android Java] drawBitmap
g.drawBitmap(bitmaps.island, 0, 0, null);
3. 글자색 넣기 - drawString, drawText
[Java] drawString
g.setColor(new Color(0x000000));
g.drawString(str, (width - fm.stringWidth(str)) / 2 - i, height - 16 - i);
[Android Java] drawText
Pnt.setColor(0x000000);
g.drawText(str, (width - fm.stringWidth(str)) / 2 - i, height - 16 - i,Pnt);
4. 이미지에 대한 AffineTransform
자바는 이를 지원하는 AffineTransform 클래스가 있는 반면, 안드로이드는 Matrix 라는 클래스가 존재하는 걸로 알고 있으며, Canvas에서 이 클래스를 얻어서 사용 할 수 있다(getMatrix,setMatrix) 그렇지만 현재 이 메서드는 deprecated 되었으며, 구글에서는 Canvas에서 사용 할 수 있도록 AffineTransform을 지원하고 있다. 다음 코드를 보면 된다.
[Java]
AffineTransform af = g.getTransform();
g.translate(xCenter, yCenter);
g.scale(1.5, 1.5);
g.scale(1, 0.5);
g.rotate(-rot);
g.translate(-128, -128);
g.drawImage(bitmaps.island, 0, 0, null);
g.setTransform(af);
g.translate(xCenter, yCenter);
[Android Java]
g.translate(xCenter, yCenter);
g.scale(1.5f, 1.5f);
g.scale(1f, 0.5f);
g.rotate((float)-rot);
g.translate(-128, -128);
g.drawBitmap(bitmaps.island, 0, 0, null);
//g.setMatrix(g.getMatrix());
g.translate(xCenter, yCenter);
5. 이미지 생성
이것도 별반 다를것이 없으며, API를 참고 해서 살을 붙이면 되겠다.
[Java] - java.awt.image.BufferedImage;
BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
[Android Java] - android.graphics.Bitmap
Bitmap image = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
6. 글자그리기
[Java]
String s = "이것은 글이야"
FontMetrics fm = g.getFontMetrics();
g.setColor(new Color(0x477D8F));
g.drawString(s, x + 8 - fm.stringWidth(s) / 2 - i, y - i);
[Android Java]
Pnt.setColor(0x477D8F);
g.drawText(s, x + 8 - Pnt.measureText(s) / 2 - i, y - i,Pnt);
7. 이미지그리기
이것도 별반 다를것이 없으며, 보통 큰 이미지에서 이미지를 클립해서 쓸때 사용되는 형태이다.
유의할 사항은 이미지를 칠할 때 자바와 안드로이드와의 차이가 강조된 것처럼 사용 할 수 있다는 것이다. 메서드의 시그너처 설명은 API를 참고 하여야 한다.
[Java] - javax.imageio.ImageIO
BufferedImage island = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
int[] pixels = new int[256*256];
ImageIO.read(Bitmaps.class.getResource("/island.gif")).getRGB(0, 0, 256, 256, pixels, 0, 256);
island.setRGB(0, 0, 256, 256, pixels, 0, 256);
[Android Java] - android.graphics.BitmapFactory
Bitmap island = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
Bitmap srcBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.island);
int[] pixels = new int[256*256];
srcBitmap.getPixels(pixels, 0, 256, 0, 0, 256, 256);
island.setPixels(pixels, 0, 256, 0, 0, 256, 256);
8.BitMap 클래스와 BufferedImage 클래스
[Java] - javax.imageio.ImageIO
pin = ImageIO.read(Tools.getResource("res/img/search_pin.jpg"));
[Android Java] - android.graphics.BitmapFactory
pin = BitmapFactory.decodeResource(getResources(), R.drawable.search_pin);
9. Handler 클래스와 SwingUtilities.invokeLater()
[Android Java] - Handler & Thread
private class ConnectTask extends Thread{
String url;
public ConnectTask(String url) {
super();
this.url = url;
}
@Override
public void run() {
super.run();
... 생략 ...
Message msg = Message.obtain();
msg.what = 200;
msg.obj = object;
mHandler.sendMessage(msg);
}
}
private Handler mHandler = new Handler() {
public void handleMessage(Message m) {
if (m.obj != null) {
... 뭔가 한다 ...
}
invalidate();
}
};
[Java] - SwingUtilities.invokeLater()
10. Toast 클래스와 JFrame + Thread?
[Android Java] - Toast
Toast.makeText(context, "더 이상 확대 할 수 없습니다.",2000).show();
[Java]
이렇게까지 해야 하는 지는 몰겠지만...
Toast.makeText("더 이상 확대 할 수 없습니다.", Toast.LENGTH_SHORT).start();
public static Timer makeText(String text, Object lengthShort) {
final int TIME_VISIBLE = 3000; //in milliseconds
JOptionPane pane = new JOptionPane(text, JOptionPane.INFORMATION_MESSAGE);
final JDialog dialogErr = pane.createDialog(null, "Toast");
dialogErr.setModal(false);
dialogErr.setVisible(true);
return new Timer(TIME_VISIBLE, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialogErr.setVisible(false);
}
});
}
이상.
'모바일프로그래밍 > 안드로이드' 카테고리의 다른 글
[안드로이드]애플리케이션(성능 등..) 분석 툴 (1) | 2023.01.30 |
---|---|
[안드로이드]dex 파일 65535 크기 넘어가는 오류 잡아 보기 (0) | 2023.01.21 |
[ProGuard] 안드로이드 애플리케이션의 최적화, 난독화 및 최소화 (0) | 2023.01.14 |
데이터베이스 동시 접근 – Sqlite (0) | 2023.01.13 |
안드로이드 확장 리스트 뷰에 대한 자습서 (0) | 2023.01.12 |