コード例 #1
0
  /**
   * Converts a drawable to a tiled version of itself. It will recursively traverse layer and state
   * list drawables.
   */
  private Drawable tileify(Drawable drawable, boolean clip) {

    if (drawable instanceof LayerDrawable) {
      LayerDrawable background = (LayerDrawable) drawable;
      final int N = background.getNumberOfLayers();
      Drawable[] outDrawables = new Drawable[N];

      for (int i = 0; i < N; i++) {
        int id = background.getId(i);
        outDrawables[i] =
            tileify(
                background.getDrawable(i), (id == R.id.progress || id == R.id.secondaryProgress));
      }

      LayerDrawable newBg = new LayerDrawable(outDrawables);

      for (int i = 0; i < N; i++) {
        newBg.setId(i, background.getId(i));
      }

      return newBg;

    } else if (drawable instanceof StateListDrawable) {
      StateListDrawable in = (StateListDrawable) drawable;
      StateListDrawable out = new StateListDrawable();
      int numStates = in.getStateCount();
      for (int i = 0; i < numStates; i++) {
        out.addState(in.getStateSet(i), tileify(in.getStateDrawable(i), clip));
      }
      return out;

    } else if (drawable instanceof BitmapDrawable) {
      final Bitmap tileBitmap = ((BitmapDrawable) drawable).getBitmap();
      if (mSampleTile == null) {
        mSampleTile = tileBitmap;
      }

      final ShapeDrawable shapeDrawable = new ShapeDrawable(getDrawableShape());

      final BitmapShader bitmapShader =
          new BitmapShader(tileBitmap, Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);
      shapeDrawable.getPaint().setShader(bitmapShader);

      return (clip)
          ? new ClipDrawable(shapeDrawable, Gravity.LEFT, ClipDrawable.HORIZONTAL)
          : shapeDrawable;
    }

    return drawable;
  }
  public static Drawable fromDrawable(Drawable drawable) {
    if (drawable != null) {
      if (drawable instanceof RoundedDrawable) {
        // just return if it's already a RoundedDrawable
        return drawable;
      } else if (drawable instanceof ColorDrawable) {
        // FIXME we don't support ColorDrawables yet
        return drawable;
      } else if (drawable instanceof LayerDrawable) {
        LayerDrawable ld = (LayerDrawable) drawable;
        int num = ld.getNumberOfLayers();

        // loop through layers to and change to RoundedDrawables if possible
        for (int i = 0; i < num; i++) {
          Drawable d = ld.getDrawable(i);
          ld.setDrawableByLayerId(ld.getId(i), fromDrawable(d));
        }
        return ld;
      }

      // try to get a bitmap from the drawable and
      Bitmap bm = drawableToBitmap(drawable);
      if (bm != null) {
        return new RoundedDrawable(bm);
      } else {
        Log.w(TAG, "Failed to create bitmap from drawable!");
      }
    }
    return drawable;
  }
コード例 #3
0
 {
     int k = layerdrawable1.getId(i);
     Drawable drawable2 = layerdrawable1.getDrawable(i);
     if (k == 0x102000d || k == 0x102000f)
     {
         flag = true;
     } else
     {
         flag = false;
     }
     drawable[i] = tileify(drawable2, flag);
     i++;
 }