我做了一个自定义布局,想要为实现RadioButton
。android类的代码在这里:
public class MyRadioButton extends LinearLayout implements View.OnClickListener{ private ImageView iv; private TextView tv; private RadioButton rb; private View view; public MyRadioButton(Context context) { super(context); view = View.inflate(context, R.layout.my_radio_button, this); setOrientation(HORIZONTAL); rb = (RadioButton) view.findViewById(R.id.radioButton1); tv = (TextView) view.findViewById(R.id.textView1); iv = (ImageView) view.findViewById(R.id.imageView1); view.setOnClickListener(this); rb.setOnCheckedChangeListener(null); } public void setImageBitmap(Bitmap bitmap) { iv.setImageBitmap(bitmap); } public View getView() { return view; } @Override public void onClick(View v) { boolean nextState = !rb.isChecked(); LinearLayout lGroup = (LinearLayout)view.getParent(); if(lGroup != null){ int child = lGroup.getChildCount(); for(int i=0; i布局代码在这里
目前,我不知道如何更改继承自
LinearLayout
toRadioButton
并保持相同的布局。这应该喜欢,但有圆角
1> aminography..:有两种方法可以完成这项工作:
1.当我们听到一个自定义视图时,它驱使我们重写
onDraw
方法,然后将所需内容绘制到视图的中Canvas
。2.在这种情况下,有一种更简单的方法
drawableLeft
。在这里,我已经扩展AppCompatRadioButton
并将设置的布局设置为drawableLeft
。
MyRadioButton.java
package com.aminography.radiobutton; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.MultiTransformation; import com.bumptech.glide.load.engine.GlideException; import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.Target; import jp.wasabeef.glide.transformations.MaskTransformation; // TODO: If you are using androidx import androidx.annotation.Nullable; import androidx.appcompat.widget.AppCompatRadioButton; // TODO: If you are using appcompat //import android.support.annotation.Nullable; //import android.support.v7.widget.AppCompatRadioButton; public class MyRadioButton extends AppCompatRadioButton { private View view; private TextView textView; private ImageView imageView; public MyRadioButton(Context context) { super(context); init(context); } public MyRadioButton(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public MyRadioButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private RequestListenerrequestListener = new RequestListener () { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(Bitmap resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { imageView.setImageBitmap(resource); redrawLayout(); return false; } }; public void setImageResource(int resId) { Glide.with(getContext()) .asBitmap() .load(resId) .apply(RequestOptions.bitmapTransform( new MultiTransformation<>( new CenterCrop(), new RoundedCornersTransformation(dp2px(getContext(), 24), 0, RoundedCornersTransformation.CornerType.ALL)) ) ) .listener(requestListener) .submit(); } public void setImageBitmap(Bitmap bitmap) { Glide.with(getContext()) .asBitmap() .load(bitmap) .apply(RequestOptions.bitmapTransform( new MultiTransformation<>( new CenterCrop(), new RoundedCornersTransformation(dp2px(getContext(), 24), 0, RoundedCornersTransformation.CornerType.ALL)) ) ) .listener(requestListener) .submit(); } // setText is a final method in ancestor, so we must take another name. public void setTextWith(int resId) { textView.setText(resId); redrawLayout(); } public void setTextWith(CharSequence text) { textView.setText(text); redrawLayout(); } private void init(Context context) { view = LayoutInflater.from(context).inflate(R.layout.my_radio_button_content, null); textView = view.findViewById(R.id.textView); imageView = view.findViewById(R.id.imageView); redrawLayout(); } private void redrawLayout() { view.setDrawingCacheEnabled(true); view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); view.buildDrawingCache(true); Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); setCompoundDrawablesWithIntrinsicBounds(new BitmapDrawable(getResources(), bitmap), null, null, null); view.setDrawingCacheEnabled(false); } private int dp2px(Context context, int dp) { return (int) (dp * context.getResources().getDisplayMetrics().density); } } my_radio_button_content.xml
视觉结果:
注意:
1.如果
appcompat
在项目中使用,请androidx
在类顶部注释导入,并取消注释appcompat
。2.你可以简单地通过改变更改自定义布局的位置
android:paddingLeft
为你RadioButton
:
编辑:我已经使用
Glide
和重写了代码,以解决圆角图像的要求Glide-Transformations
。build.gradle
dependencies { implementation 'com.github.bumptech.glide:glide:4.9.0' implementation 'jp.wasabeef:glide-transformations:3.3.0' }