के लिए घुमावदार ऑनस्क्रीन कीबोर्ड कैसे बनाएं I Android के लिए एक घुमावदार ऑन-स्क्रीन कीबोर्ड बनाना चाहते हैं। मैंने सॉफ्ट कोडबोर्ड और Google कोड पर स्क्रीन कीबोर्ड पर कई अन्य की जांच की है। जो भी मैंने पाया है वह एक कीबोर्ड आकार शामिल नहीं है जो आयताकार के अलावा कुछ भी है। आदर्श रूप में, मैं एक कीबोर्ड बनाना चाहता हूं जिसमें स्क्रीन के विपरीत किनारों पर दो सेमी-सर्कल में वितरित कुंजी शामिल हों (यानी, पक्षों द्वारा एक टैबलेट धारण करने और अपने अंगूठे के साथ चाबियाँ मारने में सक्षम होने की कल्पना करें)।Android
मैंने जिस कोड की जांच की है, उसके बारे में ऑनस्क्रीन कीबोर्ड दृश्य (आमतौर पर कीबोर्ड व्यू का विस्तार) के रूप में बनाए जाते हैं और स्क्रीन के नीचे एक निरंतर बार के रूप में दिखाई देते हैं। मेरे लक्ष्य के अनुमान के रूप में, मैंने Google कोड (डॉटडैश-कीबोर्ड-एंड्रॉइड) पर पाया गया कोड बदलने के लिए निचले बाएं कोने में केवल अपनी चाबियां खींचने की कोशिश की है और निचले दाएं कोने को पारदर्शी छोड़ दें। मैं दृश्य के आयामों को प्रभावित करने के लिए माप पर ओवरराइड करने में सक्षम हूं (नीचे देखें), लेकिन यह केवल कुंजी की स्थिति को बदलने के लिए लगता है, न कि कंटेनर की स्थिति। दूसरे शब्दों में, स्क्रीन के नीचे भरने वाली एक ब्लैक बार अभी भी है।
//Located within KeyboardView
@Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
this.setMeasuredDimension(200, 200);
}
क्या मैं भी संभव करना चाहता हूं? क्या इसके लिए एक और सही शब्द है? क्या ऐसी परियोजनाएं हैं जिन्हें मैं उदाहरण के रूप में उपयोग कर सकता हूं?
मैंने इस .setLayoutParams का उपयोग करके दृश्य के आयामों को सेट करने का भी प्रयास किया है - लेकिन, इन कॉलों का कोई प्रभाव नहीं पड़ता है। मैंने इसका उपयोग करने का भी प्रयास किया है। माता-पिता अभिभावक दृश्य तक पहुंचने के लिए (यदि कोई भी अस्तित्व में है) और इसके आयामों को बदलता है लेकिन यह दृष्टिकोण काम नहीं करता है (या, मैं बस इसे गलत कर रहा हूं)। कोई भी सहायताकाफी प्रशंसनीय होगी।
धन्यवाद
अद्यतन: 2012/12/21 - मुझे लगता है कि मैं माता पिता के वर्ग के OnDraw विधि ओवरराइड करने के लिए की जरूरत है।
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 ओवरराइड और आकर्षित जो कुछ भी मैं कैनवास पर चाहते हैं कर सकते हैं: here देखते हुए, यह KeyboardView के OnDraw विधि की तरह एक कैनवास है कि स्क्रीन निम्नलिखित कोड का उपयोग कर के आकार के बराबर है करने के लिए ड्रॉ लग रहा है।
अपडेट: 12/21/2012 - मैंने ड्रॉ ओवरराइड कर दिया है और अब यह स्पष्ट है कि कीबोर्ड व्यू आयाम है जिसे मैं इसे (200x200) पर सेट कर रहा हूं। Hierarchyview का उपयोग करके, मैं देख सकता हूं कि कीबोर्डव्यू आईडी इनपुट इनपुट के साथ एक framelayout के अंदर है। तो, क्षैतिज पट्टी जो पूरी चौड़ाई भरती है वह इस framelayout है। लेकिन, मैं इसे नहीं बना रहा हूं - यह कहां से आया है और मैं इसके आयामों को कैसे बदल सकता हूं?
अद्यतन: 12/22/2012 - अधिक परीक्षण के बाद, ऐसा लगता है कि कीबोर्डव्यू के व्यवहार (आयाम) को उस गतिविधि द्वारा निर्धारित किया जाता है जो इसे कॉल करता है। ब्राउज़र में, मुझे वह व्यवहार मिलता है जो मैं वर्णन कर रहा हूं: कीबोर्ड विंडो की स्क्रीन के नीचे एक बार को समायोजित करने के लिए ब्राउज़र विंडो की ऊंचाई कम हो जाती है, भले ही कीबोर्ड की चौड़ाई चौड़ाई से कम हो स्क्रीन। कैलेंडर ऐप में, कीबोर्ड आकार दिखाई देता है क्योंकि मैंने इसे सेट किया है (निचले बाएं कोने में एक वर्ग के रूप में) कैलेंडर के नीचे अपरिवर्तित दिखाई देने वाला कैलेंडर। इसलिए, इस दृष्टिकोण का उपयोग करके अधिकांश ऐप्स के साथ अपने लक्ष्य तक पहुंचना असंभव लगता है। आईएमई सेवा पॉपअपविंडो या संवाद बनाने का एक वैकल्पिक दृष्टिकोण हो सकता है। एक समस्या यह है कि पॉपअपविंडो को पैरेंट व्यू या एंकर को अटैच करने की आवश्यकता होती है और मुझे नहीं लगता कि आईएमई सेवा से शीर्षतम दृश्य देखना संभव है। शायद मैं वर्तमान गतिविधि पर एक पारदर्शी दृश्य बना सकता हूं और उस पर पॉपअप रख सकता हूं?
अद्यतन: 12/23/2012 - प्रगति। मुझे पता चला है कि कीबोर्ड IME से पॉपअप कैसे प्रदर्शित करें। अगला कदम यह पता लगाने के लिए है कि पॉपअप को थोड़ा दौर/कार्बनिक कैसे बनाया जाए। स्रोत के बाद मैंने जो किया उसके बारे में एक स्क्रीनशॉट यहां दिया गया है।
स्रोत। निम्न विधि सेवा आईएमई कक्षा में है और बच्चे (सेवा के) द्वारा देखी गई है मेजर विधि पर ताकि कीबोर्ड एक ही समय में पॉपअप खुल जाए। मैंने कीबोर्ड के आयाम को 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();
}
}
इस लिंक को देखें। [घुमावदार आकार का उपयोग] [http://stackoverflow.com/a/10140513/793943)। – Sush
दिलचस्प सवाल - संभावित उत्तरों के लिए इसका पालन करेगा .... दुख की बात है कि आपकी मदद करने के लिए मुझे कुछ भी जोड़ने की ज़रूरत नहीं है। –