2013-12-23 5 views
-1

Мой текущий код:Добавить границу и некоторый другой стиль ImageView во время выполнения

LinearLayout.LayoutParams params = new TableLayout.LayoutParams(
      LinearLayout.LayoutParams.WRAP_CONTENT, 
      LinearLayout.LayoutParams.WRAP_CONTENT); 

     ImageView imageview= new ImageView(this); 
     imageview.setImageBitmap(bmp); 
     imageview.setLayoutParams(params); 
     layout.addView(imageview); 

Как я могу добавить границу к этому ImageView? Я пробовал:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape android:shape="rectangle"> 
      <gradient android:angle="90" 
         android:startColor="@color/image_border_start" 
         android:centerColor="@color/image_border_center" 
         android:endColor="@color/image_border_end" /> 
     </shape> 
    </item> 
    <item android:top="1dp" android:left="1dp" 
      android:right="1dp" android:bottom="1dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/default_back_color" /> 
     </shape> 
    </item> 
</layer-list> 

и iv.setImageResource(R.drawable.style);, но затем он показывает только эту границу, а не изображение. Является ли это возможным?

+0

Я обновил свой ответ, чтобы включить другой метод, который можно использовать. Пожалуйста, посмотрите и дайте мне знать, если это сработает. –

ответ

6

Вы должны установить R.drawable.style в качестве фона. Затем добавьте дополнение к вашему ImageView. Смотрите код:

ImageView imageView = new ImageView(this); 
imageView.setImageBitmap(bmp); 
imageView.setLayoutParams(params); 
imageView.setBackgroundResource(R.drawable.style); 
imageView.setPadding(2,2,2,2); // <- try out different values 

Примечание: Если изображение (bmp) является квадратом, то граница будет появляться совершенно вокруг изображения. Если изображение не является квадратом, то площадь границы (в зеленой) появится вокруг изображения, а остальное пространство будет заполнено черным цветом, как показано ниже:

enter image description here

Однако, если вы не хочу этот эффект, а вы хотите, чтобы растянуть изображение, чтобы заполнить границы, (без черного пространства), а затем обновить свой код следующим образом:

ImageView imageView = new ImageView(this); 
imageView.setImageBitmap(bmp); 
imageView.setLayoutParams(params); 
imageView.setBackgroundResource(R.drawable.main_header_selector); 
imageView.setPadding(2, 2, 2, 2); 
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); // <- set the scale 
imageView.setCropToPadding(true); // <- requires API 16 or more 

Это будет иметь эффект, как показано ниже:

enter image description here

Примечание: (1) Я использовал зеленую рамку для демонстрационных целей. (2) Размер границы может быть увеличена за счет изменения android:top,left,right,bottom значения в вашем style.xml

UPDATE: Другой метод, как граница может быть применен к изображению является расширение BitmapDrawable, а затем рисунок таможенной границы прямоугольника. Объявляет class следующим образом:

public class BorderDrawable extends BitmapDrawable { 

    private static final int BORDER_WIDTH = 10; 
    private final int[] GRADIENT_COLORS = {Color.BLUE, Color.GREEN, Color.RED}; 
    Paint borderPaint; 

    public BorderDrawable(Resources res, Bitmap bitmap) { 
     super(res, bitmap); 
     this.borderPaint = new Paint(); 
     borderPaint.setStrokeWidth(BORDER_WIDTH); 
     borderPaint.setStyle(Paint.Style.STROKE); 

     // set border gradient 
     Shader shader = new LinearGradient(0, 0, 0, getBounds().bottom, GRADIENT_COLORS, null, Shader.TileMode.CLAMP); 
     borderPaint.setShader(shader); 

     // or the border color 
     // borderPaint.setColor(Color.GREEN); 

    } 

    @Override 
    public void draw(Canvas canvas) { 
     super.draw(canvas); 
     // draw 
     canvas.drawRect(getBounds(), borderPaint); 
    } 
} 

использование его следующим образом:

BorderDrawable drawable = new BorderDrawable(getResources(), bmp); 
imageView.setImageDrawable(drawable); 

, приведенный выше класс может быть изменен в соответствии с вашими потребностями:

1) BORDER_WIDTH значение определяет толщину граница в пикселях.

2) GRADIENT_COLORS цвета определяют цвета, используемые для градиента на границе. Измените их на основе ваших значений, таких как image_border_start и т. Д.

Выход будет идеальной границей, независимо от размера изображения.

1

вы могли бы получить что-то подобное дро на само изображение, то вдоль линий

public Bitmap addBorder(Bitmap bitmap){ 
    Canvas canvas = new Canvas(bitmap); 
    Paint paint = new Paint(Paint.ANIT_ALIAS_FLAG); 
    paint.setColor(Paint.BLACK); 

    Path path = new Path(); 
    path.addRect(0,0,bitmap.getWidth(),bitmap.getHeight(),Direction.CW); 

    canvas.drawPath(path,paint); 
    return bitmap; 
} 

не совсем уверен, что это 100% правильно, но в основном превратить растровое изображение в холст, где вы можете рисовать на его и просто используйте размеры изображения, чтобы нарисовать прямоугольник вокруг изображения.

0

Не используйте iv.setImageResource(R.drawable.style). Он просто заменяет фактическое растровое изображение.

Вместо этого, используйте:

iv.setBackgroundResource(R.drawable.style). 
Смежные вопросы