나는 안드로이드에 대한 가정 양조자 사람 캐릭터 작성자를 개발 중입니다. 기본적으로 머리, 수염, 셔츠, 바지 등을 선택할 수 있습니다. 합성 패턴을 사용하여 현재 착용 한 얼굴 특징 및 옷을 저장합니다. 나는 캔버스를 사용하여 사용자가 작성중인 사용자 정의 문자의 현재 상태를 표시합니다. 내 액티비티가 시작되면 캔버스가 즉시 3 비트 맵을 그립니다.하지만 사용자가 헤어 유형을 클릭 (터치)하면 예를 들어 드로잉이 어떤 이유로 (때로는 ~ 1 분까지) 비정상적으로 오래 걸립니다. 왜 이런 일이 일어나고 있는지 합리적인 설명을 찾을 수없는 것 같습니다. 미리 감사드립니다.안드로이드 느린 비트 맵을 그리는 캔버스 동작
내에서 onCreate 재정의 된 메서드의 일부 :
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play);
character = new Character();
character.attach(this); //observes the character
assetManager = getAssets();
BitmapLoader.setAssetManager(assetManager);
/*...*/
characterView = (LinearLayout) findViewById(R.id.character_view);
initCanvas();
initButtons();
loadPersistedCharacter();
character.notifyAllObservers(); //just for testing purposes
}
내 캔버스 초기화 코드 :
의류 또는 얼굴 기능을 사용하여 (onClickListeners의 도움으로) 클릭private void initCanvas() {
Paint paint = new Paint();
Bitmap background = Bitmap.createBitmap(600, 800, Bitmap.Config.ARGB_8888);
canvas = new Canvas(background);
paint.setColor(Color.parseColor("#CD5C5C"));
characterView.setBackground(new BitmapDrawable(getResources(), background));
}
이전 코드와 동일한 Activity에서 찾을 수있는 업데이트 메서드가 호출되는 Observer 패턴
@Override
public void update() {
Paint paint = new Paint();
Skin skin = character.getSkin();
Bitmap bitmap = BitmapLoader.load(skin.getPath());
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
float scale = skin.getScale();
int asd = bitmap.getWidth();
int asdY = bitmap.getHeight();
float coordX = (canvas.getWidth() - scale * asd)/skin.getXPosDivider();
float coordY = (canvas.getHeight() - scale * asdY)/skin.getYPosDivider();
RectF rect= new RectF(coordX, coordY, coordX + scale * bitmap.getWidth(), coordY + scale * bitmap.getHeight());
canvas.drawBitmap(bitmap, null, rect, paint);
for (HeadFeature feature : character.getHeadFeatures()) {
scale = feature.getScale();
bitmap = BitmapLoader.load(feature.getPath());
coordX = (canvas.getWidth() - scale * bitmap.getWidth())/feature.getXPosDivider();
coordY = (canvas.getHeight() - scale * bitmap.getHeight())/feature.getYPosDivider();
rect= new RectF(coordX, coordY, coordX + scale * bitmap.getWidth(), coordY + scale * bitmap.getHeight());
canvas.drawBitmap(bitmap, null, rect, paint);
}
}
SurfaceView에 그리기 하시겠습니까? 특히 세금을 부과하는 것에 대해서는 1 분 정도 소요될 것입니다. 또한 메인 스레드에서 드로잉하는 경우 ANR 충돌이 발생하지만 SurfaceView 스레드에서 드로잉을하면이 문제가 발생하지 않습니다. – DeeV
또한 작은 최적화 기능을 사용하면 각 그리기주기마다 '페인트'또는 'RectF'와 같은 새 개체를 만들지 않으면 성능이 향상됩니다. 클래스 수준에서이를 버리고 세터 메소드를 사용하여 업데이트하십시오. – DeeV
팁 주셔서 감사합니다. SurfaceView를 사용하지 않고 간단한 LinearLayout을 사용합니다. SurfaceView를 사용해 보았지만 onSurfaceCreated 콜백은 결코 호출되지 않았습니다. SurfaceView와 함께 배경을 투명하게 만들 수 없었습니다. 나는 ANR 사고를 당했다고 생각하지 않는다. 그것은 단지 이상한 이유로 즉시 그려 내지 않을 것이다. 드로잉은 내가 생각하는 주 스레드에서 발생합니다. – masm64