当前位置: 首页 > 知识库问答 >
问题:

自定义ImageView类onClick更改imageResource

东门翰
2023-03-14

我已经创建了一个自定义的 ImageView 类,并且当用户单击它时,我正在尝试更改 imageResource,但我能够从该类调用 setImageResource()。

此外,我还想像第二个图像视图一样进行存储。我的意思是,我的自定义imageView具有相同的starterimagerviewresource,但当单击它时,它必须是动态的imageView,例如:

ImageView1 ic_launcher(用户尚未单击它) ImageView1 ic_user(用户已单击它)

你能指导如何做到这一点吗?

这是我的自定义图像视图类:

public class CustomImageView extends android.support.v7.widget.AppCompatImageView implements View.OnClickListener {
    private View.OnClickListener clickListener;
    public CustomImageView(Context context) {
        super(context);
        setOnClickListener(this);
    }

    public CustomImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setOnClickListener(this);
    }

    public CustomImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setOnClickListener(this);
    }


    @Override
    public void setOnClickListener(OnClickListener l) {
        if (l == this) {
            super.setOnClickListener(l);
        } else {
            clickListener = l;
        }
    }

    @Override
    public void onClick(View v) {
        //Should change the imageResource here but also I should have to change it again if user wants (to the initial one)
        if (clickListener != null) {
            clickListener.onClick(this);
        }
    }
}

共有1个答案

姚鹤龄
2023-03-14

自定义可切换ImageView解决方案

值/attr.xml中的自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ToggleImageView">
        <attr name="low_img" format="reference" />
        <attr name="high_img" format="reference" />
    </declare-styleable>

</resources>

自定义图像视图类:

public class ToggleImageView extends AppCompatImageView implements View.OnClickListener {
    private Drawable mLowDrawable, mHighDrawable;
    private boolean isLow = true;

    public ToggleImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        // Extract drawables from custom attributes
        TypedArray values = context.obtainStyledAttributes(attrs, R.styleable.ToggleImageView);
        setLowDrawable(values.getDrawable(R.styleable.ToggleImageView_low_img));
        setHighDrawable(values.getDrawable(R.styleable.ToggleImageView_high_img));
        values.recycle();

        setImageDrawable(mLowDrawable);

        super.setOnClickListener(this);
    }

    public void setLowDrawable(Drawable drawable) {
        mLowDrawable = drawable;

        if (isLow)
            setImageDrawable(mLowDrawable);
    }

    public void setHighDrawable(Drawable drawable) {
        mHighDrawable = drawable;

        if (!isLow)
            setImageDrawable(mHighDrawable);
    }

    @Override
    public void setOnClickListener(@Nullable OnClickListener l) {
        // Do nothing to block setting listener from outer caller
    }

    @Override
    public void onClick(View view) {
        toggle();
    }

    public void toggle() {
        isLow = !isLow;

        setImageDrawable(isLow ? mLowDrawable : mHighDrawable);
    }
}

xml布局中的用法:

<?xml version="1.0" encoding="utf-8" ?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.example.tamhuynh.testfragment.ToggleImageView
        android:id="@+id/toggle_img"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center"
        app:high_img="@mipmap/high_drawable"
        app:low_img="@drawable/low_drawable"
        tools:low_img="@drawable/low_drawable" />

</FrameLayout>
 类似资料:
  • 我最近开发了一个网站, 我创建了一个带有slug'job_post‘的自定义post类型,然后客户端也添加了许多post, 我现在需要将slug更改为“/jobs”, 有没有一种方法可以做到这一点而不删除所有的帖子?我担心我会把网站搞乱, 非常感谢,

  • 本文向大家介绍Android自定义圆角ImageView,包括了Android自定义圆角ImageView的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码了。 java类如下: 定义一个attr.xml的文件,放在values目录下面,内容如下: 使用示例如下: 先要声明属性的名字空间: 然后再写跟一般定义View一样: 效果如图: 以上代码简单介绍了Android自定义圆

  • 我有一个图像视图和一堆图像,但问题是我想一个接一个地显示图像视图中的所有图像,图像应该像gif动画一样每秒钟或每0.2秒改变一次。

  • 我已经注册了我的自定义帖子类型,但我想知道如何更改标题下方出现的“所有”的标签。 例如,在帖子类别中,我有“所有帖子”,对于媒体,我可以看到库...但是在我创建了我的自定义帖子类型后,我的“所有”条目与主条目具有相同的名称。 这是我创建的标签数组。 通过更改名称或Singular_name"Header"和"All"菜单项都会更改。我只能怀疑有一个标签不见了,但在这方面我找不到任何留档。 有什么帮

  • 我已经扩展了TreeCell和TreeItem类。MyTreeItem包含一个自定义属性,我在MyTreeCell中使用它来渲染图形/字体等。问题是当我设置MyTreeCell.custom属性我不知道如何使TreeView/单元格重绘。 例如: 任何关于解决方案或(缺乏)设计方法的意见都受到赞赏。

  • 本文向大家介绍Android自定义GestureDetector实现手势ImageView,包括了Android自定义GestureDetector实现手势ImageView的使用技巧和注意事项,需要的朋友参考一下 不说废话了,进入我们今天的主题吧。 先贴上前面内容的地址: Android手势ImageView三部曲(一) Android手势ImageView三部曲(二) Android手势Ima