동일한 이미지 리소스 (예: R.drawable.samplebitmap)를 여러곳에서 사용하고 해당 Drawable의 속성을 바꾸면 다른 곳에서도 같이 변경됨.


예를 들어 ActionBar의 배경색에 사용될 Drawable을 메인화면에서는 원본 그대로 사용하고, 상세 페이지에서는 스크롤 상태에 따라 투명도를 적용했는데, 투명도 적용 후 메인화면으로 돌아가면 똑같이 투명도가 변경되는 이슈 발생.

(같은 R.drawable.samplebitmap리소스에 대해서 각각 get해서 사용한 상태)


Android에서 동일한 리소스에 대해서 메모리 낭비를 방지하기 위헤 Constant state를 공유하고 이로 인해서 변경 사항이 모든 Drawable에 영향을 끼치고 있음.


해결 방법으로는 Drawable의 mutate()메소드를 호출해서 얻어진 Drawable로 원하는 작업 수행.


문제가 발생하는 경우에 대한 예제 코드로 하기 코드를 Adapter의 getView() 메소드와 같이 반복적으로 사용하는 경우 star.setAlpha() 수행 결과가 book.isFavorite()의 결과와 상관 없이 일괄 적용됨.


Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
  star.setAlpha(255); // opaque
} else {
  star.setAlpha(70); // translucent
}


문제를 해결하는 예제 코드

Drawable star = context.getResources().getDrawable(R.drawable.star);
if (book.isFavorite()) {
  star.mutate().setAlpha(255); // opaque
} else {
  star. mutate().setAlpha(70); // translucent
}
참고자료: http://android-developers.blogspot.kr/2009/05/drawable-mutations.html


Posted by Gungume
,

Fragment를 ViewPager를 사용해서 보여주는 경우, 아래와 같이 setUserVisibleHint 메소드를 Fragment 클래스에서 Override해서 사용하면 해당 Fragment가 사용자에게 보이는 시점을 찾을 수 있다.


isVisibleToUser값이 True인 경우가 사용자에게 보이는 시점.


public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser) {

    } else {

    }
}

참고자료: http://stackoverflow.com/questions/10024739/how-to-determine-when-fragment-becomes-visible-in-viewpager

Posted by Gungume
,

Android에서 "Application" 클래스에서는 전역변수와 같이, 공통으로 사용될 정보들을 관리 가능.


Application 클래스내에서 여러 모듈에서 공통으로 접근이 가능한 정보를 넣어서 활용할 수 있고, onCreate 메소드의 경우 어플리케이션이 생성될 때 호출되므로, Singleton 초기화 등에 활용 가능.


Application 클래스를 상속해서 구현하며, AndroidManifest.xml 파일의 <application> tag의 name 필드에 관련정보를 넣어줘야함.


SampleApplication.java
import android.app.Application;

public class SampleApplication extends Application {
    public SampleApplication() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }
}


AndroidManifest.xml


Posted by Gungume
,
public class AuilUtils {

    public AuilUtils() {
    }

    static private String getImageUri(String uri, Scheme scheme) {
        if (uri != null) {
            return scheme.wrap(uri);
        }

        return null;
    }

    static public String getUriFromFile(String filePath) {
        return getImageUri(filePath, Scheme.FILE);
    }

    static public String getUriFromContent(String contentUri) {
        return getImageUri(contentUri, Scheme.CONTENT);
    }

    static public String getUriFromDrawable(int drawableId) {
        return getImageUri(String.valueOf(drawableId), Scheme.DRAWABLE);
    }

    static public String getUriFromWeb(String webUri) {
        if (webUri.toLowerCase(Locale.US).startsWith("http")) {
            return webUri;
        }

        return getImageUri(webUri, Scheme.HTTP);
    }
}


Acceptable URIs examples

"http://site.com/image.png" // from Web
"file:///mnt/sdcard/image.png" // from SD card
"file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)
"content://media/external/images/media/13" // from content provider
"content://media/external/video/media/13" // from content provider (video thumbnail)
"assets://image.png" // from assets
"drawable://" + R.drawable.img // from drawables (non-9patch images)

참고자료: https://github.com/nostra13/Android-Universal-Image-Loader#acceptable-uris-examples


Posted by Gungume
,
WP7 Silverlight기반 프로젝트에서 전체화면 페이지를 구성하려면 아래와 같이 상단 트레이와 하단 어플리케이션바를 없애주면 됩니다.
SystemTray.IsVisible = false;
this.ApplicationBar.IsVisible = false;

Posted by Gungume
,
아래 코드는 TransformToVisual을 이용해서 현재 페이지 기준으로 특정 Element의 위치를 구하는 코드입니다.
// Obtain transform information based off root element
GeneralTransform gt = element.TransformToVisual(Application.Current.RootVisual);

// Find the four corners of the element
Point topLeft = gt.Transform(new Point(0, 0));
Point topRight = gt.Transform(new Point(element.RenderSize.Width, 0));
Point bottomLeft = gt.Transform(new Point(0, element.RenderSize.Height));
Point bottomRight = gt.Transform(new Point(element.RenderSize.Width, element.RenderSize.Height));

아래는 참고한 사이트입니다~
Posted by Gungume
,

Popup클래스에 Orientation을 지원하기 위해서는 2가지 방법이 있는데 첫번째 방법은 Popup을 xaml코드를 이용해서 visual tree에 넣는 방법이고, 두번째 방법은 Behind Code에서 RotateTransform을 이용해서 직접 회전시켜 주는 방법입니다.

첫번째 방법인 xaml을 이용하는 방법은 Panel 컨트롤 등 아래에 Popup을 넣는 방법으로 이렇게 해주면 Orientation이 알아서 적용되고, Popup이 띄워질 위치의 기준은 Panel컨트롤이 됩니다.

아래는 xaml코드의 일부로 Popup안에 Button을 하나 올려놓고, 해당 Popup은 ContentPanel(Grid control) 기준으로 50*50 위치에 팝업되어서 나타납니다.

    
        
    


두번째 방법인 RotateTransform을 이용하는 방법은 Landscape 상태일떄 Popup을 각각 90, -90도 돌려주고, 그에 맞게 VerticalOffset과 HorizontalOffset을 음수 좌표로 변경해줘야합니다.

아래는 Behind code의 일부로 Popup을 전체화면 기준으로 300*300에 팝업되도록 할 때 Orientation이 LandscapeLeft일때 Popup을 설정하는 코드입니다. RotateTransform을 이용해서 90도로 변경하고, VerticalOffset을 음수좌표로 변경하는 코드로 이때 480은 (Landscape기준)화면의 세로 길이입니다.
RotateTransform transform = new RotateTransform();
transform.Angle = 90d;
popup.RenderTransform = transform;

popup.VerticalOffset = 300 - 480;
popup.HorizontalOffset = 300;

아래는 샘플 프로그램의 캡쳐화면이고, 전체소스는 첨부파일에 있습니다~
Portrait

Portrait

LandscapeLeft

LandscapeLeft

LandscapeRight

LandscapeRight



아래는 참고한 사이트입니다~
Posted by Gungume
,
Windows Phone 7의 Orientation을 PortraitOrLandscape로 설정했다면 현재의 Orientation을 얻어오거나 Orientation이 변경되는 시점을 알아야할 때가 있습니다.

현재의 Orientation을 얻어오려면 PhoneApplicationPage.Orientation Property를 사용하면 되고, Orientation이 변경되는 시점을 알고 싶으면 PhoneApplicationPage.OrientationChanged Event를 등록해서 사용하면 됩니다.

아래는 샘플코드이고 둘다 PageOrientation enum값을 사용합니다.

public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();

        //Add EventHandler
        this.OrientationChanged += new EventHandler(MainPage_OrientationChanged);
    }

    void MainPage_OrientationChanged(object sender, OrientationChangedEventArgs e)
    {
        PageOrientation orientation = e.Orientation;
        //Check current orientation
        if ((orientation & PageOrientation.Portrait) == (PageOrientation.Portrait))
        {
            // Portrait
        }
        else
        {
            // Landscape
        }
    }

    PageOrientation GetCurrentOrientation()
    {
        return this.Orientation;
    }
}

Orientation에 대한 자세한 정보는 아래 MSDN을 참고하세요~
Posted by Gungume
,
Windows Phone 7에서는 세로모드(portrait)와 가로모드(landscape)를 지원하는데 기본적으로는 portrait모드로 설정되어있습니다.

이 Orientation은 페이지별로 설정가능하며 xaml과 Behind code에서 SupportedOrientations 값을 이용해서 설정할 수 있으며 설정될 수 있는 값은 각각 Portrait, LandscapePortraitOrLandscape입니다.

아래 코드는 각각 xaml과 Behind code(C#)를 이용해서 프로그램에서 지원할 Orientation을 설정하는 코드입니다.

//xaml
SupportedOrientations="Portrait"
SupportedOrientations="Landscape"
SupportedOrientations="PortraitOrLandscape"

//Behind code(C#)
this.SupportedOrientations = SupportedPageOrientation.Portrait;
this.SupportedOrientations = SupportedPageOrientation.Landscape;
this.SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;
Posted by Gungume
,
아래는 wav파일을 재생하는 코드입니다.

우선 VisualStudio의 솔루션 탐색기를 통해서 "Microsoft.Xna.Framework" 어셈블리를 참조합니다.

재생시킬 wav파일은 프로젝트에 추가후에 content로 설정하고, 아래 코드에 있는OpenStream()의 매개변수로 파일명을 설정해줍니다.
var stream = TitleContainer.OpenStream("FileName.wav");
var effect = SoundEffect.FromStream(stream);
FrameworkDispatcher.Update();
effect.Play();

아래는 참고한 사이트입니다~
Posted by Gungume
,