2012-12-21 1 views
31

Android 용 곡선 온 스크린 키보드를 만들고 싶습니다. 나는 softkeyboard를 검사하고, 다른 것들은 google 코드에 스크린 키보드를 사용한다. 내가 찾은 것은 사각형이 아닌 키보드 모양과 관련이 없습니다. 이상적으로는 화면의 반대쪽에있는 두 개의 반원에 걸쳐 키가 분산되어있는 키보드를 만들고 싶습니다 (예 : 양면으로 태블릿을 들고 엄지 손가락으로 키를 치는 것을 상상해보십시오).Android 용 곡선 온 스크린 키보드를 만드는 방법

필자가 살펴본 코드 중에서 화면 키보드는보기 (일반적으로 KeyboardView를 확장)로 만들어지고 화면 아래쪽에 연속 막대로 나타납니다. 내 목표에 대한 근사치로서, 구글 코드에서 발견 된 코드를 변경하려고 시도했다. (dotdash-keyboard-android) 키의 왼쪽 하단 모서리를 그리고 오른쪽 아래 모퉁이를 투명하게 유지한다. 뷰의 크기에 영향을 주도록 onMeasure를 재정의 할 수 있었지만 (아래 참조) 컨테이너의 위치가 아니라 키의 위치 만 변경하는 것처럼 보입니다. 다시 말해 화면 하단에는 검은 색 막대가 채워져 있습니다.

//Located within KeyboardView 
@Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
    this.setMeasuredDimension(200, 200); 
} 

내가 원하는 것까지도 가능합니까? 이에 대한 더 정확한 용어가 있습니까? 예로서 사용할 수있는 프로젝트가 있습니까?

또한 this.setLayoutParams를 사용하여 뷰의 크기를 설정하려고 시도했지만 이러한 호출은 아무 효과가없는 것 같습니다. 또한 this.getParent를 사용하여 상위 뷰 (심지어 존재하는 경우)에 액세스하고 치수를 변경하려고 시도했지만이 접근 방식은 작동하지 않습니다. (또는 단지 잘못하고 있습니다.) 어떤 도움이라도 대단히 감사 할 것입니다.

당신에게

UPDATE 감사합니다 2012년 12월 21일를 - 내가 부모 클래스의 된 onDraw 메소드를 오버라이드 (override) 할 필요가 있다고 생각합니다.

final int width = Math.max(1, getWidth()); 
final int height = Math.max(1, getHeight()); 
mBuffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
mCanvas = new Canvas(mBuffer); 

내가 된 onDraw을 무시하고 내가 캔버스에 원하는대로 그릴 수 있다고 생각 : KeyboardView의 onDraw는 방법은 다음 코드를 사용하여 화면의 크기와 동일 캔버스에 그리는 것처럼 here를 보면, 그것은 보인다.

업데이트 : 2012 년 12 월 21 일 - onDraw를 재정의하고 keyboardView가 (200x200)으로 설정하는 치수임을 분명히했습니다. Hierarchyview를 사용하면 keyboardview가 id InputArea 인 framelayout 안에 있음을 알 수 있습니다. 따라서 전체 너비를 채우는 가로 막대가이 framelayout입니다. 그러나 나는 그것을 창조하지 않을 것입니다 - 그것이 어디서 왔으며 그 치수를 어떻게 바꿀 수 있습니까?

업데이트 : 2012 년 12 월 22 일 - 테스트를 더 거친 후에는 keyboardview의 동작 (크기)이 부분적으로 해당 동작을 호출하는 활동에 의해 결정된 것처럼 보입니다. 브라우저에서, 나는 설명하고있는 동작을 얻는다. 키보드의 너비가 키보드의 너비보다 작더라도 키보드를 보유하고있는 화면의 하단을 가로 지르는 막대를 수용하기 위해 브라우저 창의 높이가 줄어든다. 화면. 캘린더 앱에서는 키보드 왼쪽 하단에 정사각형으로 설정 한대로 키보드 크기가 변경되지 않은 상태로 나타납니다. 따라서이 접근법을 사용하는 대부분의 앱에서 내 목표에 도달하는 것은 불가능한 것처럼 보입니다. IME 서비스에서 팝업 창이나 대화 상자를 만드는 방법도 있습니다. 하나의 문제는 popupwindows가 상위 뷰나 앵커를 첨부해야하며 IME 서비스에서 최상위 뷰를 찾을 수 없다고 생각합니다. 아마도 현재 활동에서 투명한 화면을 만들고 그 위에 팝업을 배치 할 수 있습니까?

업데이트 : 2012 년 12 월 23 일 - 진행. 키보드 IME에서 팝업을 표시하는 방법을 알아 냈습니다. 다음 단계는 팝업을 조금/유기적으로 만드는 방법을 찾는 것입니다. 다음은 내가 수행 한 작업의 스크린 샷과 소스입니다. Emulator screenshot of keyboard

출처. 다음 메소드는 서비스 IME 클래스에 있으며 아이 (서비스) 뷰의 onMeasure 메소드에 의해 호출되어 키보드가 그려지는 동시에 팝업이 열립니다. 키보드의 크기를 1x1로 설정 했으므로 보이지 않습니다. 로그 문은 팝업 위치를 결정하는 데 도움이됩니다.

public void initiatePopupWindow() 
{ 
    try { 
     WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); 
     Display display = wm.getDefaultDisplay(); 
     DisplayMetrics dm = new DisplayMetrics(); 
     display.getMetrics(dm); 
     //display.getSize(p); 


     Log.i("dotdashkeyboard","initiatePopupWindow (from IME service)"); 
     LayoutInflater inflater = (LayoutInflater) this.getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View layoutLeft = inflater.inflate(R.layout.popup_layout_left,null); 
     View layoutRight = inflater.inflate(R.layout.popup_layout_right, null); 
     // create a 300px width and 470px height PopupWindow 
     int popupHeight = 300; 
     int popupWidth = 200; 
     if (popUpLeft == null) popUpLeft = new PopupWindow(layoutLeft, popupWidth, popupHeight, false); 
     if (popUpRight == null) popUpRight = new PopupWindow(layoutRight, popupWidth, popupHeight, false); 

     int ypos = 0; 
     int xposRight = 0; 



     if (display.getRotation() == Surface.ROTATION_0) { 
      ypos = -(dm.heightPixels/2 + popupHeight/2); 
      xposRight = (dm.widthPixels - popupWidth); 
      Log.i("dotdashkeyboard","test rotation=normal"); 
     } else if (display.getRotation() == Surface.ROTATION_90) { 
      ypos = -(dm.heightPixels/2 + popupHeight/2)/2; 
      xposRight = (dm.widthPixels - popupWidth)*2-popupWidth; 
      Log.i("dotdashkeyboard","test rotation=90-degrees"); 
     } else { 
      Log.i("dotdashkeyboard","test rotation=unknown=" + display.getRotation()); 
     } 

     popUpLeft.showAtLocation(inputView, Gravity.NO_GRAVITY, 0, ypos); 
     popUpRight.showAtLocation(inputView, Gravity.NO_GRAVITY, xposRight, ypos); 

     Log.i("dotdashkeyboard","test created popup at ypos="+ypos + " xposRight=" + xposRight); 
     Log.i("dotdashkeyboard","test screenWidth=" + dm.widthPixels + " screenHeight=" + dm.heightPixels); 

     Button cancelButton = (Button) layoutLeft.findViewById(R.id.popup_cancel_button); 
     //cancelButton.setOnClickListener(inputView.cancel_button_click_listener); 
     cancelButton.setOnClickListener(cancel_button_click_listener); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+2

이 링크를 클릭하십시오. [곡선 모양 사용] (http://stackoverflow.com/a/10140513/793943). – Sush

+1

흥미로운 질문 - 가능한 대답을 위해 따라갈 것입니다 .... 슬프게도 저는 당신을 돕기 위해 추가 할 것이 없습니다. –

답변

1

여기 제대로 된 것 같습니다. 앞서 언급했듯이 대부분의 활동은 키보드 창 공간을 제공하기 위해보기를 축소하므로 호출 활동이 화면을 가득 채우려면 PopupWindow와 같은 보조 창을 사용해야합니다. 기본 창의 크기를 0x0으로 설정할 수 있습니다.

popUpLeft.setBackgroundDrawable(null)/popUpRight.setBackgroundDrawable(null)을 사용해 보셨습니까? 이렇게하면 반투명 배경이 제거되고 위에 그려진 그림 만 표시됩니다.

관련 문제