대상이미지중 마스크 이미지의 투명하지 않은 영역만을 보여줌



ImageView img = photoContents;


Canvas canvas = new Canvas();

Bitmap mainImage = BitmapFactory.decodeFile(imageFile

.getAbsolutePath());

Bitmap tmpMask = BitmapFactory.decodeResource(context.getResources(),

R.drawable.mask);

Bitmap mask = Bitmap.createScaledBitmap(tmpMask, mainImage.getWidth(), mainImage.getHeight(), true);

tmpMask.recycle();

tmpMask = null;

Bitmap result = Bitmap.createBitmap(mainImage.getWidth(),

mainImage.getHeight(), Bitmap.Config.ARGB_8888);


canvas.setBitmap(result);

Paint paint = new Paint();

paint.setFilterBitmap(false);


canvas.drawBitmap(mainImage, 0, 0, paint);

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));  

// DST_IN,  DST_OUT(mask reverse)

canvas.drawBitmap(mask, 0, 0, paint);

paint.setXfermode(null);


img.setImageBitmap(result);

img.invalidate();



< ref > 


Posted by tenn
,

UI Thread 이외에서 UI를 갱신하려고 하면 CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views. 라는 문구를 보게 된다.


Handler


UI의 권한이 있는 Thread의 핸들러에 메시지를 보낸다.

Thread + Handler 조합으로 연속적인 갱신이 가능.



public final Handler handler = new Handler{

@Override

public void handleMessage(Message msg) {

//UI 갱신

}

}



외부에서

xxx.handler.sendEmptyMessage();



Activity.runOnUiThread


UI 갱신 권한이 있는 스레드의 인스턴스를 얻을수 있다면



AActivity.this.runOnUiThread(

new Runnable(){

public void run(){

AActivity.this.xxxx.setText("xxxx");

}}

);



Handler.post 사용


Handler handler = new Handler();


...


handler.post(

new Runnable(

public void run(){

//UI 갱신

}

)

);




그 외의 방법도 있다고 한다. (미확인)


View.post(Runnable)
View.postDelayed(Runnable, long)


Posted by tenn
,

[Android] ASyncTask

Android 2012. 8. 16. 15:39

Thread의 UI 갱신 제한 → Thread + Handler 로직 (복잡함) → ASyncTask


UI갱신 제한에 대해서는


<예제> 인자가 없는 


액티비티의 Nested Class로 구현함.

UI의 갱신은 onPreExecute와 onPostExecute에서는 가능했으나, 

doInBackground, onProgressUpdate에서는 에러.



class MyASyncTask extends AsyncTask<Void, Void, Void> {


@Override

protected void onPreExecute() {

super.onPreExecute();

}


@Override

protected Void doInBackground(Void... params) {

SystemClock.sleep(2000);

return null;

}


@Override

protected void onProgressUpdate(Void... unuse) {

super.onProgressUpdate();

}


@Override

protected void onPostExecute(Void unuse){

super.onPostExecute(unuse);

}


}



Posted by tenn
,