如何为Android自定义键盘设置不同的按键背景

如何为Android自定义键盘设置不同的按键背景,android,android-softkeyboard,soft-keyboard,Android,Android Softkeyboard,Soft Keyboard,我正在开发自定义键盘应用程序 这是软键盘中input.xml的背景色代码:- @Override public View onCreateInputView() { Log.e("onStartInputView ","On StartInput View Called--"); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this)

我正在开发自定义键盘应用程序

这是软键盘中
input.xml
的背景色代码:-

     @Override
    public View onCreateInputView() {


      Log.e("onStartInputView ","On StartInput View Called--");

      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
      String Backgroundcolour = preferences.getString("BackgroundColour","");

     Log.e("Brithnesss- -","----"+Backgroundcolour);

    if(Backgroundcolour.equalsIgnoreCase("black"))
    {

    this.mInputView = (KeyboardView) getLayoutInflater().inflate(
            R.layout.input, null);


    }else
    {
        this.mInputView = (KeyboardView) getLayoutInflater().inflate(
            R.layout.input1, null);
        //this.mInputView.setB
    }

    this.mInputView.setOnKeyboardActionListener(this);
    this.mInputView.setKeyboard(this.mQwertyKeyboard);
    return this.mInputView;
}

 @Override public void onStartInputView(EditorInfo attribute, boolean restarting) {
    super.onStartInputView(attribute, restarting);
    // Apply the selected keyboard to the input view.

    setInputView(onCreateInputView());

}

我不知道如何为特定的键设置背景图像。

为了简单起见,您应该创建类
MyKeyboardView
,并进行类似的操作

public class MyKeyboardView extends android.inputmethodservice.KeyboardView {

    Context context;
    public MyKeyboardView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        this.context = context ;
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/Hippie.otf");
        paint.setTypeface(font);
        paint.setTextSize(40);

        List<Key> keys = getKeyboard().getKeys();
        for(Key key: keys) { // int i = 0 ; switch(i) and implement your logic 

        if(key.pressed){
            NinePatchDrawable npd = (NinePatchDrawable)context.getResources().getDrawable(R.drawable.glow);
            npd.setBounds(key.x,key.y,key.x+key.width,key.y+key.height);
            npd.draw(canvas);
            if(key.label != null)
                canvas.drawText(key.label.toString(), key.x + (key.width/2), key.y + 25, paint);
        }else if(key.modifier){  // boolean that defines key is function key
            NinePatchDrawable npd = (NinePatchDrawable)context.getResources().getDrawable(R.drawable.btn_keyboard_special);
            npd.setBounds(key.x,key.y,key.x+key.width,key.y+key.height);
            npd.draw(canvas);
            if(key.label != null)
                canvas.drawText(key.label.toString(), key.x + (key.width/2), key.y + 25, paint);
        }


        break;
    }
}
公共类MyKeyboardView扩展了android.inputmethodservice.KeyboardView{
语境;
公共MyKeyboardView(上下文、属性集属性){
超级(上下文,attrs);
//TODO自动生成的构造函数存根
this.context=上下文;
}
@凌驾
公共空白onDraw(画布){
super.onDraw(帆布);
油漆=新油漆();
Typeface font=Typeface.createFromAsset(context.getAssets(),“font/Hippie.otf”);
绘画。设置字体(字体);
油漆.尺寸(40);
列表键=getKeyboard().getKeys();
对于(Key:Key){//int i=0;切换(i)并实现您的逻辑
如果(按下键){
NinePatchDrawable npd=(NinePatchDrawable)context.getResources().getDrawable(R.drawable.glow);
npd.立根(key.x,key.y,key.x+key.width,key.y+key.height);
绘图(画布);
如果(key.label!=null)
drawText(key.label.toString(),key.x+(key.width/2),key.y+25,paint);
}else如果(key.modifier){//定义键的布尔值是函数键
NinePatchDrawable npd=(NinePatchDrawable)context.getResources().getDrawable(R.drawable.btn_keyboard_special);
npd.立根(key.x,key.y,key.x+key.width,key.y+key.height);
绘图(画布);
如果(key.label!=null)
drawText(key.label.toString(),key.x+(key.width/2),key.y+25,paint);
}
打破
}
}
例如,有一个创建自定义数字键盘的方法。在该方法中的CustomKeyboardView类或您自己的自定义键盘类中,添加如下方法。它覆盖onDraw()方法,并将使用代码7(在本例中为“0”)定义的键的背景绘制为红色,将所有其他键绘制为蓝色

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    List<Key> keys = getKeyboard().getKeys();
    for (Key key : keys) {            
        if (key.codes[0] == 7) {
            Log.e("KEY", "Drawing key with code " + key.codes[0]);
            Drawable dr = (Drawable) context.getResources().getDrawable(R.drawable.red_tint);
            dr.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            dr.draw(canvas);

        } else {
            Drawable dr = (Drawable) context.getResources().getDrawable(R.drawable.blue_tint);
            dr.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            dr.draw(canvas);
        }            
    }
}
@覆盖
公共空白onDraw(画布){
super.onDraw(帆布);
列表键=getKeyboard().getKeys();
对于(键:键){
if(键代码[0]==7){
Log.e(“键”,“带代码的绘图键”+键代码[0]);
Drawable dr=(Drawable)context.getResources().getDrawable(R.Drawable.red_-tint);
立根博士(x键,y键,x键+宽度键,y键+高度键);
draw博士(帆布);
}否则{
Drawable dr=(Drawable)context.getResources().getDrawable(R.Drawable.blue_-tint);
立根博士(x键,y键,x键+宽度键,y键+高度键);
draw博士(帆布);
}            
}
}

在本例中,我没有使用9-patch图像,只使用了一些简单的50%透明方形图像,并实现了现有按钮仅使用我想要的颜色着色的效果。为了获得更自定义的结果,我可以使我的背景可绘制9-patch图像并执行以下操作。请注意,带有图标的两个键无法正确渲染是的,因为图标没有被定义为9补丁图像,并且我没有做任何特别的努力来让它们在这个例子中能够很好地缩放。我也没有针对键的不同状态使用不同的图像/效果;其他人已经展示了如何做到这一点

@Override
public void onDraw(Canvas canvas) {
    // super.onDraw(canvas);

    List<Key> keys = getKeyboard().getKeys();
    for (Key key : keys) {
        if (key.codes[0] == 7) {
            NinePatchDrawable npd
                = (NinePatchDrawable) context.getResources().getDrawable(R.drawable.red_key);
            npd.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            npd.draw(canvas);

        } else {
            NinePatchDrawable npd
                = (NinePatchDrawable) context.getResources().getDrawable(R.drawable.blue_key);
            npd.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            npd.draw(canvas);
        }

        Paint paint = new Paint();
        paint.setTextAlign(Paint.Align.CENTER);
        paint.setTextSize(48);
        paint.setColor(Color.GRAY);

        if (key.label != null) {
            canvas.drawText(key.label.toString(), key.x + (key.width / 2),
                            key.y + (key.height / 2), paint);
        } else {
            key.icon.setBounds(key.x, key.y, key.x + key.width, key.y + key.height);
            key.icon.draw(canvas);
        }
    }
}    
@覆盖
公共空白onDraw(画布){
//super.onDraw(帆布);
列表键=getKeyboard().getKeys();
用于(键:键){
if(键代码[0]==7){
NinePatch可绘制npd
=(NinePatchDrawable)context.getResources().getDrawable(R.drawable.red_键);
npd.立根(键x、键y、键x+键宽度、键y+键高度);
绘图(画布);
}否则{
NinePatch可绘制npd
=(NinePatchDrawable)context.getResources().getDrawable(R.drawable.blue_键);
npd.立根(键x、键y、键x+键宽度、键y+键高度);
绘图(画布);
}
油漆=新油漆();
paint.setTextAlign(paint.Align.CENTER);
油漆.尺寸(48);
油漆。设置颜色(颜色。灰色);
如果(key.label!=null){
canvas.drawText(key.label.toString(),key.x+(key.width/2),
键y+(键高度/2),油漆);
}否则{
key.icon.setBounds(key.x,key.y,key.x+key.width,key.y+key.height);
key.icon.draw(画布);
}
}
}    

我创建了一个键盘应用程序,我在其中使用了
KeyboardView
中的
keybackbackground
属性,如下所示:

<KeyboardView android:keyBackground="@drawable/buttonbgselector" .../>

参考这个我没有得到这么多正确的形式,你能告诉我如何设置不同的颜色键吗?我需要为特定的键背景设置背景,而不是为整个键盘设置相同的键背景图像。我迫切需要hi@user…我已经完成了彩色键,但键中的文本不可见。你能帮我吗???如何要在长按自定义键盘视图的键时以编程方式更改弹出窗口背景吗?答案中提供的链接不能回答问题。@MaihanNijat,它本身不应该这样做;它只是提供了一个相当标准样式的自定义键盘的方便。答案中显式添加的代码演示了一个简单化的问题ge转到该项目(或官方文件和其他S/O帖子中提供的类似代码)来回答OP的问题。@Scott你用什么来关闭键盘?@ste9206我用彩色键完成了操作,但键中的文本不可见。你能帮我吗??
@Override 
public View onCreateInputView() {
    mInputView = (KeyboardView) getLayoutInflater().inflate(R.layout.input, null);
    mInputView.setBackgroundResource(R.drawable.buttonbgselector);
    mInputView.setOnKeyboardActionListener(this);
    mInputView.setKeyboard(mQwertyKeyboard);
    return mInputView;
}