【问题标题】:How to highlight a border of an Image View when I clicked imageview in android当我在android中单击imageview时如何突出显示图像视图的边框
【发布时间】:2016-08-28 07:06:18
【问题描述】:

我在 android 中有水平视图中的图像列表。如果我单击图像视图的特定图像,则必须以编程方式突出显示边框颜色。 如何为图像视图的突出显示边框做到这一点。 提前致谢。

当用户单击 ImageView 的单个图像时,我希望像这样显示 ImageView 的边框。

代码

horizontalimage=(LinearLayout)findViewById(R.id.linearimage);
                                               // final RelativeLayout r1=(RelativeLayout)findViewById(R.id.relative_border);
                                             //   frame=(FrameLayout)findViewById(R.id.framelayout
  if(multipleimage.length()>0) {
  for (int j = 0;j<multipleimage.length();j++)
    {
    pimages=multipleimage.getJSONObject(j);
    JSONObject oneimage=multipleimage.getJSONObject(0);
    ii= new ImageView(singleshooppingcart.this);
    multipleimages=(ImageView)findViewById(R.id.singleimage);

   ii.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
   LinearLayout.LayoutParams image = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
   image.width=100;
   image.height=1
   image.setMargins(5,0,0,0);


   final String multimgs=pimages.getString("original_res");
   String oneimg=oneimage.getString("original_res");


   String[] img2 = multimgs.split("\\.");
   String imagone=productpath + alertObj.getString("seller_id")+  '/' + img2[0] + '(' + '1' + '0' + '0' + ')' + '.' + img2[1];
   String singleiamges=productpath + alertObj.getString("seller_id")+  '/' + oneimg;
// displayimages=productpath + alertObj.getString("seller_id")+  '/' + multimgs[];
   YelloPage.imageLoader.displayImage(imagone, ii, options);
   YelloPage.imageLoader.displayImage(singleiamges, multipleimages, options);

   ii.setLayoutParams(image);
 // ii.setBackgroundResource(R.drawable.imgviewpress);
 //  ii.setBackground(R.drawable.imgviewpress);
                                                       /* GradientDrawable gd = new GradientDrawable();
     gd.setColor(R.drawable.imageviewhighlight); // Changes this drawbale to use a single color instead of a gradient
     gd.setCornerRadius(5);
                  // gd.setStroke(1, 0xFF000000);
     ii.setBackgroundDrawable(gd);*/

     horizontalimage.addView(ii);
     ii.setOnClickListener(new View.OnClickListener() {
       @Override
   public void onClick(View view) {

   Drawable highlight = getResources().getDrawable( R.drawable.imgviewpress);
   ii.setBackground(highlight);
   int indexOfImage = horizontalimage.indexOfChild(view);
   String img1=String.valueOf(indexOfImage);



// Toast.makeText(getApplicationContext(),img1,Toast.LENGTH_LONG).show();
    try {
         images = multipleimage.getJSONObject(Integer.parseInt(img1)).getString(String.valueOf("original_res"));
        } catch (JSONException e) {
         e.printStackTrace();
        }
       // Toast.makeText(getApplicationContext(),images,Toast.LENGTH_LONG).show();
      // multipleimages.setImageResource(indexOfImage);
         try 
         YelloPage.imageLoader.displayImage(productpath + alertObj.getString("seller_id")+"/"+images, multipleimages, options);
         } catch (JSONException e) {
         e.printStackTrace();
         }

        // String img1=String.valueOf(indexOfImage);
     // YelloPage.imageLoader.displayImage(displayimages[indexOfImage], multipleimages, options);
 }
             });

【问题讨论】:

  • 您可以像这样快速解决问题。这可能不是最初的答案,但它可能有效。您在 ImageView 下放置一个 View 并在 View 和 ImageView 之间放置 2 dip 的间隙。然后当你触摸 ImageView 时,只需在动画或其他东西中改变 View 的颜色几秒钟,然后恢复到原来的状态。
  • 给它一个 StateList 背景(只是 xml,不需要 Java)。简单。
  • 你试过选择器吗?
  • 我以编程方式编写了所有内容
  • 为什么不用选择器?

标签: android android-layout android-fragments android-studio android-imageview


【解决方案1】:
  1. 在drawable文件夹中创建一个drawable文件。

highlight.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
    <corners android:radius="0dp"/>
    <solid android:color="@android:color/transparent"/>
    <stroke android:color="#FFC830"
        android:width="3dp"/>
</shape>
  1. 您的活动中的 ImageView

    <ImageView
    android:id="@+id/iv_test"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:padding="3dp"
    android:src="@drawable/yourImageName"
    android:tint="@color/colorAccent"/>
    

这里的填充很重要。

  1. 内部活动代码

    imv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Drawable highlight = getResources().getDrawable( R.drawable.highlight);
            imv.setBackground(highlight);
            //
            //Do your other stuff here.
            //
        }
    });
    

如果要删除背景,请使用以下代码:

imv.setBackground(null);

在activity xml 中,padding 属性很重要,因为高亮背景将采用与imageview 相同的大小。因此,如果 imageview 中有任何图像,我们将无法看到背景/突出显示。因此 padding 属性将图像向内推了一点,让高光可见。

输出

更新

在您的代码内部实现 View.OnClickListener。

改变你的 onClick() 方法

@Override
public void onClick(View v) {
    Drawable highlight = getResources().getDrawable( R.drawable.highlight );
    for (int j=0;j<ii.length;j++)
    {
        if (ii[j].getBackground()!=null) {
            ii[j].setBackground(null);
        }
    }
    v.setBackground(highlight);

    //
    //Do what you want to do when clicking on the imageview
    //
}

现在你正在使用

ii=new ImageView(singleshooppingcart.this);

把它变成一个数组并像这样使用它

ii[i]=new ImageView(singleshooppingcart.this);

改变这个

ii.setOnClickListener(new View.OnClickListener() {
   @Override
 public void onClick(View view) {

 Drawable highlight = getResources().getDrawable(R.drawable.imgviewpress);
ii.setBackground(highlight);

    ii[i].setOnClickListener(this);

这里 i 是循环变量。

这样,您将拥有所有 imageView 的对象。所有这些图像视图都会有一个我们设置的 ClickEvent。

【讨论】:

  • 我有水平视图中的图像列表,但它只显示最后一张图像,不显示其他图像。
  • 此边框将设置为您调用 setBackground() 函数的图像视图。请检查您是否使用了相同的 imageview 对象。再说一遍,图像是水平滚动视图还是水平线性布局......?
  • 只有图像视图必须设置此边框,而不是线性布局
  • 能否请您显示用于设置突出显示的代码。如果看到代码,我可以提供更多帮助。
  • 我用视图来获取索引,view.setBackgroundResource(R.drawable.imgviewpress);现在它正在显示所有图像,但是如果我单击一个图像视图显示该边框,那么如果我下一个图像视图再次为第一个图像视图制作不可见边框,就像想要显示的那样
【解决方案2】:

将图像放入RelativeLayout 并添加 1dp 的边距并在开始时使其不可见。 那么

imageView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        relativeLayout.SetVisibility(View.VISIBLE)
    }
});

【讨论】:

  • 我猜使用 View.OnTouchListener 更合适。
  • View.OnTouchListener 更好,你是对的 VoidExplorer
  • 但我需要 setOnClickListener 来突出显示图像视图
  • 这取决于高亮显示的目的。如果要显示用户正在选择什么,最好使用 OnTouchListener,因为一旦用户按下图像,就会激活高亮效果。如果要显示用户被选中的内容,那么 setOnClickListener 也是合适的,因为当用户将手指放在图像上时会激活高亮效果。
  • 我需要当用户被选中时才能激活高亮效果
【解决方案3】:

首先你的 imageView 保持相对布局。例如

<RelativeLayout
    android:id="@+id/relative_border"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:padding="4dp">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="38dp"
        android:background="#FFFFFF"
        android:src="@drawable/ic_launcher" />
</RelativeLayout>

然后添加以下java代码。像这样的

final RelativeLayout layout = (RelativeLayout) findViewById(R.id.relative_border);
    ImageView imageView = (ImageView) findViewById(R.id.imageView1);


    imageView.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            layout.setBackgroundColor(0xFF00FF00);
        }
    });

【讨论】:

  • 您遇到了什么问题?
  • 如果我对图像视图使用相对布局会出错
  • 您收到的错误信息是什么。可以在这里写吗?
【解决方案4】:

尝试使用 GradientDrawable

GradientDrawable gd = new GradientDrawable();
        gd.setColor(0xFF00FF00); // Changes this drawbale to use a single color instead of a gradient
        gd.setCornerRadius(5);
        gd.setStroke(1, 0xFF000000);
        Imageview imgs= (Imageview )findViewById(R.id.imgviw);
        imgs.setBackgroundDrawable(gd);

【讨论】:

  • 不,我不想这样显示,我只想在用户单击仅激活的 imageview 边框颜色时显示
  • 见上面我上传了一张这样的图片我想显示
  • 它显示整个背景我怎么能只显示边框颜色
  • 你是怎么得到图像的??
  • 我使用了选择器 ii.setBackgroundResource(R.drawable.imageviewhighlight);它正在工作,但如果我按 imageview 仅突出显示 imageview
【解决方案5】:

创建具有线性布局的自定义图像视图和带有一些填充的图像 基本上改变布局的颜色,这将为图像视图提供边框

点击使用这个,

customImageView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     //use either v.getchild(position) or v.findViewById(R.id.borderlayout)
        LinearLayout borderlayout = v.getChild(0);
     // change the border color or visibility you like to do
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-16
    • 2016-09-10
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    相关资源
    最近更新 更多