주로, 서버에 있는 사진을 Http 통신으로 가져와서 Bitmap을 Return 하는 경우도 있지만, 바로 바이너리로 써야할 경우도 있다.
아래는 InputStream 을 Byte 배열로 Return 하는 함수이다.
서버가 보안이 걸려있어서, 외부망에서는 사진을 못가지고 왔다 ㅠ 그래서 결국 바이너리를 내려받기로 했다. 휴-



private static byte[] readFromStream(InputStream pInputStream) {
        if (pInputStream == null) {
            return null;
        }

        int lBufferSize = 1024;
        byte[] lByteBuffer = new byte[lBufferSize];

        int lBytesRead = 0;
        int lTotbytesRead = 0;
        int lCount = 0;

        ByteArrayOutputStream lByteArrayOutputStream = new ByteArrayOutputStream(lBufferSize * 2);

        try {
            while ((lBytesRead = pInputStream.read(lByteBuffer)) != -1) {
                lTotbytesRead += lBytesRead;
                lCount++;

                lByteArrayOutputStream.write(lByteBuffer, 0, lBytesRead);
            }
        } catch (Throwable e) {
            e.printStackTrace(System.out);
        }

        byte[] lDataBytes = lByteArrayOutputStream.toByteArray();

        return lDataBytes;
    }

'안드로이드' 카테고리의 다른 글

Fragment onCreateView inflate Exception  (0) 2014.12.26
TextView Font Size 코드  (0) 2014.11.06
Bitmap Round  (0) 2014.06.05
ViewPager  (0) 2014.05.15
DrawerLayout  (0) 2014.05.15
Posted by 자바리즘
,
EditText 를 사용한다는 것은 Input을 받는 다는 말이 된다. 예를 들면, 글자수를 200자 까지만 제한하고 싶다면 안드로이드에서는 TextWatcher 라는 인터페이스를 사용하면 된다. 아래와 같은 베서드를 Override 해야 한다.


public void beforeTextChanged(CharSequence s, int start, int count, int after);

public void onTextChanged(CharSequence s, int start, int before, int count);

public void afterTextChanged(Editable s);



함수 이름대로 사용하면 된다. onTextChanged 는 글이 실시간으로 입력 됐을 때, afterTextChanged 는 글이 쓰여진 후에 실행이 된다.
      _edt_reply_text.addTextChangedListener(this);

      //TextWatcher 를 implements 했다면 이렇게 사용하면 된다.
     //_edt_reply_text는 EditText 객체이다.   
Posted by 자바리즘
,
Android 의 LruCache 를 쌩으로 구현한 소스코드를 배껴쓰다가(?) ^^; 캐쉬 적용이 조금 이상한 듯 싶어서 Library를 찾던 중, 괜찮을 것을 찾았다. 러시아 개발자가 만든 ImageLoader

github URL : https://github.com/nostra13/Android-Universal-Image-Loader
//전역
private DisplayImageOptions options;
ImageLoader imageLoader = ImageLoader.getInstance();


//내부 클래스 안
options = new DisplayImageOptions.Builder()
		.showImageOnLoading(R.drawable.ic_stub)   //Loading image
		.showImageForEmptyUri(R.drawable.ic_empty)  //Empty image
		.showImageOnFail(R.drawable.ic_error)          //Error image
		.cacheInMemory(true)
		.cacheOnDisk(true)
		.considerExifParams(true)
		.bitmapConfig(Bitmap.Config.RGB_565)
		.build();

imageLoader.displayImage(URL, ImageView 객체, options);
ImageLoader 라이브러리는 여러가지 displayImage 메서드를 제공한다. (오버라이드 메서드) 이렇게만 해주면, 이미지 캐싱을 해서 이미지를 가져다 준다.



'안드로이드 > Library' 카테고리의 다른 글

Fast Android Networking -2  (0) 2017.07.20
Fast Android Networking  (0) 2017.07.18
Android Debug Database  (0) 2017.07.13
DB Brower for SQLite  (0) 2017.07.12
Posted by 자바리즘
,

Bitmap Round

안드로이드 2014. 6. 5. 11:32
ImageView 에 이미지를 보여줄 때, Round 처리를 해줘야 할 때가 있다. 서버에서 이미지가 내려올 때는 사용자가 이미 올린 이미지 이므로, 디자이너가 가공해주지 않는 이상 개발자가 이 부분을 해주어야 한다. 소스는 쉽게 찾을 수 있었다. Bitmap 을 가지고 가로 세로를 구한 후, Rect를 구성하고 Canvas에 다시 그리는 식이다. 아래 roundPx 변수가 Round 되는 반경인데 45로 해두었다. Circle 형태가 필요했으므로^^ 원하는 대로 roundPx 수치만 변경하면 된다.
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;

public class BitmapRoundDrawable extends Drawable {

	private Bitmap _bitmap;
	private Paint _paint;
	private RectF _rectF;
	private int _bitmapWidth;
	private int _bitmapHeight;
	
	private int roundPx = 45;	//Round Area
	
	public BitmapRoundDrawable(Bitmap bitmap)
	{
		_bitmap = bitmap;
		_bitmapWidth = _bitmap.getWidth();
		_bitmapHeight = _bitmap.getHeight();
		
		Rect rect = new Rect(0, 0, _bitmapWidth, _bitmapHeight);
		_rectF = new RectF(rect);
		_paint = new Paint();
		_paint.setAntiAlias(true);
		_paint.setDither(true);
		
		BitmapShader shader = new BitmapShader(_bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
		_paint.setShader(shader);				
	}
	
	@Override
	public void draw(Canvas canvas) {
//		canvas.drawOval(_rectF, _paint);
		canvas.drawRoundRect(_rectF, roundPx, roundPx, _paint);
	}
	
	@Override
	protected void onBoundsChange(Rect bounds) {
		super.onBoundsChange(bounds);
		_rectF.set(bounds);
	}

	@Override
	public void setAlpha(int alpha) {
		if(_paint.getAlpha() != alpha)
		{
			_paint.setAlpha(alpha);
			invalidateSelf();
		}
		
	}

	@Override
	public void setColorFilter(ColorFilter cf) {
		_paint.setColorFilter(cf);
	}

	@Override
	public int getOpacity() {
		return PixelFormat.TRANSLUCENT;
	}

	@Override
	public int getIntrinsicWidth() {
		return _bitmapWidth;
	}
	
	@Override
	public int getIntrinsicHeight() {
		return _bitmapHeight;
	}
	
	public void setAntiAlias(boolean aa)
	{
		_paint.setAntiAlias(aa);
		invalidateSelf();
	}
	
	@Override
	public void setFilterBitmap(boolean filter) {
		_paint.setFilterBitmap(filter);
		invalidateSelf();
	}
	
	@Override
	public void setDither(boolean dither) {
		_paint.setDither(dither);
		invalidateSelf();
	}
	
	public Bitmap getBitmap()
	{
		if(_bitmap != null)
			return _bitmap;
		
		return null;
	}	
}
출처 : http://magicslot.blogspot.kr/2013/09/rounded-corner-imageview.html

'안드로이드' 카테고리의 다른 글

TextView Font Size 코드  (0) 2014.11.06
InputStream > Byte Array  (0) 2014.07.17
ViewPager  (0) 2014.05.15
DrawerLayout  (0) 2014.05.15
TableRow를 동적으로 만들기  (0) 2014.04.23
Posted by 자바리즘
,

ViewPager

안드로이드 2014. 5. 15. 16:40
ViewPager

	    android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
layout XML 파일에 위와 같이 선언을 해 놓는다.
public class ViewPagerClass extends FragmentActivity implements ActionBar.TabListener {

private ViewPager _viewpager;
private AppSectionsPagerAdapter _pagerAdapter;

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main_viewpager);
	
	_pagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());
	
	final ActionBar actionbar = getActionBar();
	actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
		
	_viewpager = (ViewPager)findViewById(R.id.pager);
	_viewpager.setAdapter(_pagerAdapter);
	_viewpager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
		@Override
		public void onPageSelected(int position) {
			actionbar.setSelectedNavigationItem(position);
		}		
	});
		
	for (int i = 0; i < _pagerAdapter.getCount(); i++) {
                 actionbar.addTab(
            	      actionbar.newTab()
                     .setText(_pagerAdapter.getPageTitle(i))
                     .setTabListener(this));
        }
}

public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {

        public AppSectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int i) {
            switch (i) {
                case 0:
                    return new OneFragment();
                case 1:
                	return new TwoFragment();
                case 2:
                	return new ThreeFragment();
                default:
                	return null;
            }
        }

        @Override
        public int getCount() {
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
        	
        	String title = "";
        	
        	switch(position)
        	{
        		case 0:
        			title = "첫번째타이틀";
        			return title;
        		case 1:
        			title = "두번째타이틀";
        			return title;
        		case 2:
        			title = "세번째타이틀";
        			return title;
        		default:
        			return title;
        	}        	
        }
    }

	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		_viewpager.setCurrentItem(tab.getPosition());
	}

	@Override
	public void onTabUnselected(Tab tab, FragmentTransaction ft) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onTabReselected(Tab tab, FragmentTransaction ft) {
		// TODO Auto-generated method stub
		
	}
}

'안드로이드' 카테고리의 다른 글

InputStream > Byte Array  (0) 2014.07.17
Bitmap Round  (0) 2014.06.05
DrawerLayout  (0) 2014.05.15
TableRow를 동적으로 만들기  (0) 2014.04.23
안드로이드 Asset 의 파일 가져오기  (0) 2014.02.20
Posted by 자바리즘
,

DrawerLayout

안드로이드 2014. 5. 15. 10:30

DrawerLayout



안드로이드의 새로운 레이아웃인 DrawerLayout 이라는게 있다.


android.support.v4.widget 에 포함되어 있다.


main_viewpager.xml


    
    

    

상단은 DrawerLayout으로 감싸져 있고, FrameLayout에는 실제 컨텐츠를 넣어주면 된다. 
 ListView가 SlideMenu가 된다. 

 java Code

public class MainFragment extends Activity { private ActionBarDrawerToggle _drawerToggle; private DrawerLayout _drawerLayout; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_viewpager); _drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); final ActionBar actionbar = getActionBar(); actionbar.setDisplayHomeAsUpEnabled(true); actionbar.setHomeButtonEnabled(true); //ActionBarDrawerToggle Params /**                  * 1. Activity                  * 2. DrawerLayout                  * 3. Drawer Icon (버튼 이미지)                  * 4. String resource                  * 5. String resource                 */ _drawerToggle = new ActionBarDrawerToggle(this, _drawerLayout, R.drawable.ic_drawer, 0, 0){ @Override public void onDrawerClosed(View drawerView) { invalidateOptionsMenu(); } @Override public void onDrawerOpened(View drawerView) { invalidateOptionsMenu(); } }; _drawerLayout.setDrawerListener(_drawerToggle); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.actionbar_menu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if(_drawerToggle.onOptionsItemSelected(item)){ return true; } return super.onOptionsItemSelected(item); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); _drawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); _drawerToggle.onConfigurationChanged(newConfig); } }




'안드로이드' 카테고리의 다른 글

Bitmap Round  (0) 2014.06.05
ViewPager  (0) 2014.05.15
TableRow를 동적으로 만들기  (0) 2014.04.23
안드로이드 Asset 의 파일 가져오기  (0) 2014.02.20
안드로이드에서 SWF 파일 재생하기  (0) 2014.01.27
Posted by 자바리즘
,

WPF Localization (다국어)

C# 2014. 5. 7. 14:38

1. ResouceDictionary를 만든다. (리소스사전)


2. 다국어파일을 정의한다.

  네이밍은 ko-KR, en-US 등, C# 고유 로컬라이즈 이름을 붙혀주면 동적 할당 하기가 쉽다.


예)

Localization.en-US.xaml

Localization.ko-KR.xaml


3. ResourceDictionary 상세

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:system="clr-namespace:System;assembly=mscorlib"
                    >
    <system:String x:Key="Hello">안녕하세요~</system:String>
</ResourceDictionary>


현재 언어상태를 가져온다.

string currentLanguage = System.Threading.Thread.CurrentThread.CurrentUICulture.ToString();


언어설정을 셋팅한다.

System.Threading.Thread.CurrentThread.CurrentUICulture = new system.Globalization.CultureInfo(currentLanguage);



4. 다국어 파일 가져오기


List<ResourceDictionary> dicList = new List<ResourceDictionary>();
            foreach (ResourceDictionary dic in System.Windows.Application.Current.Resources.MergedDictionaries)
            {
                dicList.Add(dic);
            }
                        
            string currentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture.ToString();
            string requestedCulture = "Resources/" + string.Format("Localization.{0}.xaml", currentCulture);
            
            ResourceDictionary resourceDictionary = dicList.FirstOrDefault(d => d.Source.OriginalString == requestedCulture);
            if (resourceDictionary == null)
            {
                requestedCulture = "Localization.en-US.xaml";
                resourceDictionary = dicList.FirstOrDefault(d => d.Source.OriginalString == requestedCulture);
            }
            else
            {
                System.Windows.Application.Current.Resources.MergedDictionaries.Remove(resourceDictionary);
                System.Windows.Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);
            }


5. 실습


string hello = FindResource("Hello").ToString();


위 변수에 "안녕하세요" 라는 값이 대입 된다.


FindResource로 정의된 x:Key값을 넣어주면 언어에 맞게 값을 가져온다.


'C#' 카테고리의 다른 글

WPF UIElement 이미지로 저장하기  (0) 2014.02.27
Enum  (0) 2014.01.21
코딩규약  (0) 2014.01.21
Posted by 자바리즘
,