做基于WebView应用时,页面上有一个输入框,当输入的文字过多时,超过输入框的行数时,输入框能够滚动,这时间问题来了,输入的提示箭头会移动到输入框外,如​​何​​解决这个问题呢,查找chromium源码如下:

  void LoadIfNecessary(jobject context) {

    if (loaded_)

      return;



    loaded_ = true;



    TRACE_EVENT0("browser", "HandleResources::Create");

    JNIEnv* env = base::Android::AttachCurrentThread();

    if (!context)

      context = base::android::GetApplicationContext();



    left_bitmap_ = CreateSkBitmapFromJavaBitmap(

        Java_HandleViewResources_getLeftHandleBitmap(env, context));

    right_bitmap_ = CreateSkBitmapFromJavaBitmap(

        Java_HandleViewResources_getRightHandleBitmap(env, context));

    center_bitmap_ = CreateSkBitmapFromJavaBitmap(

        Java_HandleViewResources_getCenterHandleBitmap(env, context));



    left_bitmap_.setImmutable();

    right_bitmap_.setImmutable();

    center_bitmap_.setImmutable();



    drawable_horizontal_padding_ratio_ =

        Java_HandleViewResources_getHandleHorizontalPaddingRatio(env);

  }

这个函数加载这几个图片,在java端,

    private static Bitmap getHandleBitmap(Context context, final int[] attrs) {

        // TODO(jdduke): Properly derive and apply theme color.

        TypedArray a = context.getTheme().obtainStyledAttributes(attrs);

        final int resId = a.getResourceId(a.getIndex(0), 0);

        final Resources res = a.getResources();

        a.recycle();



        final Bitmap.Config config = Bitmap.Config.ARGB_8888;

        final BitmapFactory.Options options = new BitmapFactory.Options();

        options.inJustDecodeBounds = false;

        options.inPreferredConfig = config;

        Bitmap bitmap = BitmapFactory.decodeResource(res, resId, options);

        savePic( bitmap);

        if (bitmap != null) return bitmap;



        // If themed resource lookup fails, fall back to using the Context's

        // resources for attribute lookup.

        if (res != context.getResources()) {

            bitmap = BitmapFactory.decodeResource(context.getResources(), resId, options);

            if (bitmap != null) return bitmap;

        }



        Drawable drawable = getHandleDrawable(context, attrs);

        assert drawable != null;



        final int width = drawable.getIntrinsicWidth();

        final int height = drawable.getIntrinsicHeight();

        Bitmap canvasBitmap = Bitmap.createBitmap(width, height, config);

        Canvas canvas = new Canvas(canvasBitmap);

        drawable.setBounds(0, 0, width, height);

        drawable.draw(canvas);

        return canvasBitmap;

    }

C++中会调用​​java​​中的函数getHandleBitmap,这个函数通过 context.getTheme().obtainStyledAttributes 这个函数,从jdk中加载图片资源,显示时,通过GetBitmap函数获取到图像信息,通过layer_->SetBitmap( bitmap)设置显示的内容,函数如下:


  const SkBitmap& GetBitmap(ui::TouchHandleOrientation orientation) {

    DCHECK(loaded_);

    switch (orientation) {

      case ui::TouchHandleOrientation::LEFT:

        return left_bitmap_;

      case ui::TouchHandleOrientation::RIGHT:

        return right_bitmap_;

      case ui::TouchHandleOrientation::CENTER:

        return center_bitmap_;

      case ui::TouchHandleOrientation::UNDEFINED:

        NOTREACHED() << "Invalid touch handle orientation.";

    };

    return center_bitmap_;

  }

这么分析下来,想从显示下手解决这个问题,似乎不太可能,那只有替换图片资源,而图像资源是在android.jar包中,还有其他办法吗? 分析源码,

    public static Drawable getLeftHandleDrawable(Context context) {

        return getHandleDrawable(context, LEFT_HANDLE_ATTRS);

    }



    public static Drawable getCenterHandleDrawable(Context context) {

        return getHandleDrawable(context, CENTER_HANDLE_ATTRS);

    }



    public static Drawable getRightHandleDrawable(Context context) {

        return getHandleDrawable(context, RIGHT_HANDLE_ATTRS);

    }

有这几个图像id 信息,是不是可以重载呢,于是添加自己的

<?xml version="1.0" encoding="utf-8"?>

<resources>

     <style name="MyTheme">

       <item name="android:textSelectHandleLeft">@drawable/ic_launcher</item>

       <item name="android:textSelectHandle">@drawable/aa</item>

       <item name="android:textSelectHandleRight">@drawable/ic_launcher</item>

     </style>

</resources>

替换掉系统的资源,再添加android:theme="@style/MyTheme" 自己的主题风格,问题解决