안드로이드 2.2 이하는 4메가 이상 폰트를 로드 할 수 없다.


로드가 안된 상태에서 텍스트를 셋팅하다 보면 어플이 뻗는다.


해결 방안으로는 로드 실패시 시스템 폰트로 로드 시키거나.


sd카드에서 폰트를 로드시키면 된다.


1번 해결 방안

paint.setTypeface(typeFace);
               
FontMetricsInt fm = paint.getFontMetricsInt();
 int h = (int) Math.ceil(fm.bottom - fm.top);
               
//폰트가 제대로 안만들어 진 상태 그래서 기본 폰트 사용
 if(h == 0)
{
        paint.setTypeface(Typeface.create("Arial", Typeface.NORMAL));
}



2번 해결방안


final Typeface typeface = Typeface.createFromAsset(pContext.getAssets(), pAssetName);

createFromAsset 이 함수 말고 createFromFile 이 함수 사용 하면 된다.

final Typeface typeface = Typeface.createFromFile("mnt/sdcard/폰트경로")

이렇게하면 1메가 넘는 폰트도 사용할 수 있다.


어차리 요즘은 2.2이하는 거의 없으므로 그냥 시스템 폰트 쓰는걸 추천한다.




Posted by 부우산사나이
:

ActivityManager activityManager = (ActivityManager) sContext.getSystemService(Context.ACTIVITY_SERVICE);

ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);

 

memoryInfo.availMem : 가용 할 수 있는 메모리

memoryInfo.totalMem : 총 메모리

memoryInfo.lowMemory : 메모리 부족 상태인지 확인 플래그

Posted by 부우산사나이
:

코코스에서는 키패드 불려내면 기본적인 키패드밖에 지원해주지 않는다.

 

그래서 여러가지 키패드를 불려내고 싶으면 구현해야한다.

 

CCTextFieldTTF::attachWithIME()

 

이 함수가 키패드 불려내는 함수 인데

 

이 것을 새롭게 하나 구현 하면 된다.

 

bool CCTextFieldTTF::attachWithIME( int keyType )
{
 bool bRet = CCIMEDelegate::attachWithIME();
 if (bRet)
 {
  // open keyboard
  CCEGLView * pGlView = CCDirector::sharedDirector()->getOpenGLView();
  if (pGlView)
  {
   pGlView->setIMEKeyboardState(true, keyType);
  }
 }
 return bRet;
}

 

이런식으로 구현

 

CCEGLView::setIMEKeyboardState(bool bOpen, int keyType) 이 함수 또한 새로 구현 한거임

 

CCEGLView소스는 안드로이드,win32,ios 플래폼 세군데 있는데 일단 함수는 세군대 다 만들어주고

 

난 안드로이드에서 패드 불려낼꺼니깐 안드로이드 CCEGLView  cpp,h 파일에서 구현 해주면 된다.

 

void CCEGLView::setIMEKeyboardState(bool bOpen, int keyType)
{
 setKeyboardState_KeyTypeJNI((int)bOpen, keyType);
}

 

이런식으로

 

결국엔 안드로이다 함수를 불려야 하므로 JNI통신을 해야한다.

 

이부분이 JNI통신 하는 부분

void openKeyboard_KeyTypeJNI(int keyType) {
  JniMethodInfo t;

  if (JniHelper::getStaticMethodInfo(t, "org/cocos2dx/lib/Cocos2dxGLSurfaceView", "openIMEKeyboard_KeyPadType", "(I)V")) {
   t.env->CallStaticVoidMethod(t.classID, t.methodID, keyType);
   t.env->DeleteLocalRef(t.classID);
  }
 }

 

당연히 이클립스에서 해당 java파일에서 openIMEKeyboard_KeyPadType 이 함수 부분 구현해야 한다.

 

여기서 가장 중요한것은

 

setInputType 이 함수가 키패드 타입을 셋팅 할 수 있는 함수라는 것이다.

 

//키패드 타입 설정

Cocos2dxGLSurfaceView.this.mCocos2dxEditText.setInputType(msg.arg1);

final InputMethodManager imm = (InputMethodManager)

Cocos2dxGLSurfaceView.mCocos2dxGLSurfaceView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
//키패드 보이게 호출

imm.showSoftInput(Cocos2dxGLSurfaceView.this.mCocos2dxEditText, 0);

 

Posted by 부우산사나이
: