WebView 사용시 안에 들어있는 이미지나 동영상 등의 크기를 폰의 해상도에 정확히 맞추어 보여주길 바랄 때가 많은데요 이를 위해서는 코드 하나만 추가해주면 됩니다.
 
webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);


위와 같이 WebView에 LayoutAlgorithm만 지정해주면 글자크기는 그대로 유지하면서 이미지나 동영상의 크기만 폰의 해상도에 딱맞게 조절되어 표시됩니다.


이것 땜에 며칠을 고생했는데 굉장히 단순한 방법이 있었네요..;; 한국어 웹페이지만 찾아봤던게 잘못이었어요..ㅠㅠ 앞으로는 영어페이지를 위주로 봐야할 거 같습니다. 안드로이드 개발 관련 국내 사이트들은 질문 올려도 답변도 잘 안달리고 태도들도 다들 까칠하고.. 정작 도움이 될 만한 팁도 별로 없는 거 같아요..-_-
Posted by 플라스틱라디오
정확한 이유는 모르겠는데 최근에 안드로이드 프로젝트를 apk파일로 컴파일하려고 하니 string.xml 관련하여 Lint 에러가 발생하면서 컴파일이 되지 않더군요. 다국어지원 관련한 오류인 듯 한데 에러를 없앨 수가 없더라구요.. 개발하면서는 아무런 오류가 없었는데 말이죠..

이런 경우 아주 간단한 해결방법은 Lint 에러를 warning으로 바꾸어 주는 것입니다. Lint 관련 설정은 이클립스 메뉴의 Window - Preference - Android - Lint 에서 변경할 수 있는데요.. 여기서 MissingTranslation 항목을 찾아 Severity를 warning으로 변경하면 됩니다.
Posted by 플라스틱라디오
안드로이드 4.0 이후에서는 WebView에서 유튜브나 플래시 동영상의 전체화면 모드 사용시 NullPointerException이 발생합니다. 이를 해결하기 위해서는 WebView에 WebChromeClient 를 설정해주어야 합니다. 
하지만 단순히 기본 WebChromeClient 객체를 생성하여 WebView에 설정할 경우 오류는 발생하지 않지만 영상이 정상적으로 재생이 안되는 문제가 있습니다. 

전체화면 모드가 제대로 작동되게 하려면 아래와 같이 WebChromeClient 클래스를 상속받은 클래스를 만든 후 이를 WebView에 설정하면 됩니다.

 
public class FullscreenableChromeClient extends WebChromeClient {
    protected Activity mActivity = null;

    private View mCustomView;
    private WebChromeClient.CustomViewCallback mCustomViewCallback;
    private int mOriginalOrientation;

    private FrameLayout mContentView;
    private FrameLayout mFullscreenContainer;

    private static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    public FullscreenableChromeClient(Activity activity) {
        this.mActivity = activity;
    }

    @Override
    public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            if (mCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }

            mOriginalOrientation = mActivity.getRequestedOrientation();
            FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();
            mFullscreenContainer = new FullscreenHolder(mActivity);
            mFullscreenContainer.addView(view, COVER_SCREEN_PARAMS);
            decor.addView(mFullscreenContainer, COVER_SCREEN_PARAMS);
            mCustomView = view;
            setFullscreen(true);
            mCustomViewCallback = callback;
            mActivity.setRequestedOrientation(requestedOrientation);
        }

        super.onShowCustomView(view, requestedOrientation, callback);
    }

    @Override
    public void onHideCustomView() {
        if (mCustomView == null) {
            return;
        }

        setFullscreen(false);
        FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();
        decor.removeView(mFullscreenContainer);
        mFullscreenContainer = null;
        mCustomView = null;
        mCustomViewCallback.onCustomViewHidden();
        mActivity.setRequestedOrientation(mOriginalOrientation);
    }

    private void setFullscreen(boolean enabled) {
        Window win = mActivity.getWindow();
        WindowManager.LayoutParams winParams = win.getAttributes();
        final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN;
        if (enabled) {
            winParams.flags |= bits;
        } else {
            winParams.flags &= ~bits;
            if (mCustomView != null) {
                mCustomView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
            } else {
                mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
            }
        }
        win.setAttributes(winParams);
    }

    private static class FullscreenHolder extends FrameLayout {
        public FullscreenHolder(Context ctx) {
            super(ctx);
            setBackgroundColor(ctx.getResources().getColor(android.R.color.black));
        }

        @Override
        public boolean onTouchEvent(MotionEvent evt) {
            return true;
        }
    }
}




_mWebView.setWebChromeClient(new FullscreenableChromeClient(this));




출처 : http://stackoverflow.com/questions/12398565/android-ics-flash-webview-full-screen-throws-nullpointerexception
Posted by 플라스틱라디오
안드로이드 기기는 다양한 해상도를 가지고 있기 때문에 안드로이드 앱 개발에 있어 해상도에 따른 레이아웃 구현은 상당히 까다로운 문제인데요, 여러 해상도에 대응하기 위해 레이아웃 작업 시 아래와 같은 기본 룰을 지켜는 것이 좋다고 하네요.


1. 레이아웃 디자인시에는 HVGA 기본 스크린 사이즈를 중심으로 DIP 단위만을 사용해서 디자인합니다. px과 dip가 1:1 이라서 화면 크기에 대응하여 사이즈 결정하기가 좋습니다. 320 * 480 화면 기준으로 들어갈 이미지나 UI 요소들 각각의 가로 사이즈를 px로 계산한 후 코딩시에는 그 값의 단위를 dip 로만 입력하 면 됩니다 . 

2. AbsoluteLayout 을 사용하지 않습니다. 즉 , 화면의 절대 좌표 보다는 상대 좌표를 사용해야 합니다. 이거 사용해서 디자인하면 ..나중에 감당 안됩니다. (LinearLayout이나 RelativeLayout을 사용) 

3. Bitmap 은 HDPI 기준으로 만듭니다. 그래야 자동으로 크기가 조정 되더라도 보기에 좋습니다. 즉 HVGA 를 기준으로 계산했을 때 100 * 100 이미지가 필요하다면 HDPI 기준으로 크기의 1.5 배인 150 *150 크기로 실 이미지를 제작하시면 됩니다. 만일 여력이 된다면 hdpi 및 mdpi 기준으로 각각 만드는 것도 나쁘지는 않습니다. 위에서 언급했듯이 성능에 유리합니다. 

4. 각 장치별로 레이아웃 및 이미지를 모두 별도로 만들어서 세밀하게 조정할 수도 있지만 그런 경우 관리가 힘듭니다 . 가급적 레이아웃과 이미지를 적게 사용해서 통일된 UI를 구성하는 것이 좋습니다.

5. layout xml에는 wrap_content, fill_parent, dp만을 사용합니다. 글자의 크기는 sp로 합니다.



출처 : S2 & NAMU 블로그,  돼지왕왕돼지의 놀이터 블로그




Posted by 플라스틱라디오
해상도에 따라 참고할 Layout, Drawable 폴더를 다르게 하기 위해서는 res 폴더내에 아래와 같은 이름으로 폴더를 생성하시면 됩니다.

drawable-1280x720
layout-1280x720



위와 같은 폴더를 res 폴더에 생성했을 경우 해상도가 1280x720인 폰에서는 위의 폴더에 있는 layout xml파일과 이미지 파일을 참고하여 화면을 구현하게 됩니다. 


출처 :  안드로이드펍, 보리 & 마고 블로그



 
Posted by 플라스틱라디오
Target은 사용할 컴파일러의 버전을 의미하고 minSdkVersion은 앱이 지원할 최소의 SDK 버전을 의미합니다.

Target은 가장 최신버전을 사용하는 것이 좋으며, 만일 특정 SDK 버전 이상에서만 작동되는 코드가 사용된 경우 이하의 SDK 버전에서는 오류가 발생하지 않도록 예외처리를 통해 분기 설정을 해주어야 합니다.

minSdkVersion은 앱이 지원하고자 하는  최소한의 버전을 지정해주시면 되구요.
Posted by 플라스틱라디오
Posted by 플라스틱라디오
포토샵이 한글로 설치된 경우 이를 영문으로 변경하는 방법입니다. 변경하는 법은 매우 간단한데 포토샵이 설치된 경로 안의 tw10428.dat 파일의 이름을 tw10428h.dat 로 변경한 후 포토샵을 재실행 하면 됩니다. 영문을 다시 한글로 변경하려면 반대로 tw10428.dat로 파일 이름을 변경하면 되구요.

일반적인 tw10428.dat 파일의 경로는 아래와 같습니다.


C:\Program Files\Adobe\Adobe Photoshop CS5.1 (64 Bit)\Locales\ko_KR\Support Files\tw10428.dat




출처 : 행복한 비상 블로그




 
Posted by 플라스틱라디오
포토샵에서 브러시툴 사용시 타블렛의 필압이 감지되게 하려면 브러시 설정을 변경해 주어야 합니다. 


브러시 설정화면을 연 후 Shape Dynamics에 체크를 하고 Control의 설정을 Pen Pressure로 변경합니다. 이렇게 설정하면 필압에 따라 브러시의 굵기가 달라집니다.





또한 필압에 따라 브러시의 농도도 달라지게 할 수 있는데요, 이를 위해서는 Transfer에 체크해주시고 Control을 Pen Pressure로 변경해 주시면 됩니다.



Posted by 플라스틱라디오
유튜브 동영상을 팝업 형식으로 플레이해주는 JQuery 플러그인 입니다. 아래 링크로 들어가시면 플러그인 다운로드와 자세한 사용법을 확인하실 수 있습니다.








이 플러그인을 이미지나 버튼 등에 사용하면 클릭 시 유튜브의 영상을 아래와 같은 팝업 형태로 플레이 되게 해 줍니다. 





참고 : 웹멘터 블로그





이 밖에도 팝업 형태로 비디오를 플레이 해주는 다양한 플러그인들이 있는데, 10개의 Best jQuery 팝업 플러그인을 소개하고 있는 페이지가 있어 링크를 겁니다. 아래 링크로 들어가서 마음에 드는 플러그인을 한번 찾아보세요.^^


Posted by 플라스틱라디오
TAG YouTube


맨 위로