2016-11-17 1 views
0

나는 안드로이드에 대한 가정 양조자 사람 캐릭터 작성자를 개발 중입니다. 기본적으로 머리, 수염, 셔츠, 바지 등을 선택할 수 있습니다. 합성 패턴을 사용하여 현재 착용 한 얼굴 특징 및 옷을 저장합니다. 나는 캔버스를 사용하여 사용자가 작성중인 사용자 정의 문자의 현재 상태를 표시합니다. 내 액티비티가 시작되면 캔버스가 즉시 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); 
} 
} 
+0

SurfaceView에 그리기 하시겠습니까? 특히 세금을 부과하는 것에 대해서는 1 분 정도 소요될 것입니다. 또한 메인 스레드에서 드로잉하는 경우 ANR 충돌이 발생하지만 SurfaceView 스레드에서 드로잉을하면이 문제가 발생하지 않습니다. – DeeV

+0

또한 작은 최적화 기능을 사용하면 각 그리기주기마다 '페인트'또는 'RectF'와 같은 새 개체를 만들지 않으면 성능이 향상됩니다. 클래스 수준에서이를 버리고 세터 메소드를 사용하여 업데이트하십시오. – DeeV

+0

팁 주셔서 감사합니다. SurfaceView를 사용하지 않고 간단한 LinearLayout을 사용합니다. SurfaceView를 사용해 보았지만 onSurfaceCreated 콜백은 결코 호출되지 않았습니다. SurfaceView와 함께 배경을 투명하게 만들 수 없었습니다. 나는 ANR 사고를 당했다고 생각하지 않는다. 그것은 단지 이상한 이유로 즉시 그려 내지 않을 것이다. 드로잉은 내가 생각하는 주 스레드에서 발생합니다. – masm64

답변

0

문제점은 다음과 같습니다. my characterView LinearLayout은 무효화되지 않으므로 거의 갱신되지 않았습니다. 응용 프로그램은 단순히 내 View를 새로 고쳐야한다는 것을 모르고있었습니다. characterView.invalidate()에 대한 간단한 호출로 문제가 해결되었습니다.

public void update() { 
    /*...*/ 
    characterView.invalidate(); 
} 
관련 문제