Android Studio:在“回收者视图”内部的框架布局中绘制右上角的功能区和星号

问题描述 投票:0回答:1

我已经这样创建了一个回收站视图:

My Recyclerview Row Layout

如何绘制带有圆角右上角和右下角星形且带有或不带有图像的圆角边框图像。图片由来自后端的网址加载。

这是我的回收站视图行的布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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/rlMain"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            >

            <FrameLayout
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_gravity="left"
                android:gravity="left"
                android:background="@drawable/ic_no_image"
                android:layout_margin="10dp"
                >


                <ImageView
                    android:id="@+id/convenzionato"
                    android:elevation="10dp"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:src="@drawable/convenzioni_ribbon"
                    android:visibility="visible"
                    />


                <ImageView
                    android:id="@+id/highlight"
                    android:elevation="10dp"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:src="@drawable/highlight"
                    android:visibility="visible"
                    />

                <ImageView
                    android:id="@+id/image"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scaleType="fitXY"
                    app:srcCompat="@drawable/ic_no_image">

                </ImageView>



            </FrameLayout>

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_gravity="right"
                android:gravity="right"
                android:layout_height="wrap_content">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">

                    <TextView
                        android:id="@+id/nome"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:textColor="@color/bluPrincipale"
                        android:layout_marginTop="6dp"
                        android:text="Nome Evento"
                        android:textSize="20sp"
                        android:textStyle="bold" />

                    <TextView
                        android:id="@+id/tipologia"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:textColor="@color/oro"
                        android:text="Sagra"
                        android:textSize="12sp"
                        android:textStyle="bold" />

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal">

                        <TextView
                            android:id="@+id/localita"
                            android:layout_gravity="left"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textColor="@color/grigioTipo1"
                            android:text="Città (PV)"
                            android:textSize="12sp"
                            android:textStyle="italic" />

                        <RelativeLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="right">

                        <TextView
                            android:id="@+id/kmposizione"
                            android:layout_gravity="right"
                            android:layout_width="fill_parent"
                            android:layout_height="wrap_content"
                            android:textColor="@color/grigioTipo1"
                            android:paddingRight="10dp"
                            android:drawableRight="@drawable/icona_mappa_lista"
                            android:drawablePadding="5dp"
                            android:drawableTint="@color/bluPrincipale"
                            android:textAlignment="textEnd"
                            android:text="18 km"
                            android:textSize="12sp"
                            android:textStyle="italic"
                            tools:ignore="RtlCompat" />

                        </RelativeLayout>


                    </LinearLayout>

                    <TextView
                        android:id="@+id/data"
                        android:layout_gravity="left"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:textColor="@color/grigioTipo1"
                        android:drawableTint="@color/bluPrincipale"
                        android:text="Dal 01/01/2019"
                        android:textSize="12sp"
                        android:textStyle="italic" />

                    <TextView
                        android:id="@+id/descrizione"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="@string/latino"
                        android:layout_marginBottom="10dp"
                        />

                </LinearLayout>




            </RelativeLayout>






        </LinearLayout>

    </LinearLayout>

</RelativeLayout>

和使用此的RecycerViewAdapter:

package it.colan.xxx.adapters;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Matrix;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.List;

import it.colan.xxx.Config;
import it.colan.xxx.GUI.CustomAlertDialog;
import it.colan.xxx.GUI.GeneralUtil;
import it.colan.xxx.GUI.RoundedTransformation;
import it.colan.xxx.R;
import it.colan.xxx.activities.DettaglioCosaFareActivity;
import it.colan.xxx.models.CosaFare;

public class CosaFareAdapter extends RecyclerView.Adapter<CosaFareAdapter.ViewHolder> {
    private List<CosaFare> mValues = new ArrayList<>();
    private Context mContext;

    private CustomAlertDialog customAlertDialog;

    public CosaFare getValueAt(int position) {
        return mValues.get(position);
    }

    public CosaFareAdapter(Context context) {
        mContext = context;
        mValues = new ArrayList<>();

        customAlertDialog = new CustomAlertDialog((Activity) context);
    }

    @Override
    public CosaFareAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.row_cosa_fare, parent, false);
        return new CosaFareAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final CosaFareAdapter.ViewHolder holder, final int position) {

        final CosaFare item = getValueAt(position);


       Picasso.get()
                .load(Config.IMAGE_UPLOADED_BACKEND +  item.getFoto())
                .placeholder(R.drawable.ic_no_image)
               .resize(150,150)

                .into(holder.image);



       // .transform(new RoundedTransformation(10,0))

        holder.nome.setText(GeneralUtil.removeLinesSpaces(item.getTitolo()));
        holder.localita.setText(GeneralUtil.removeLinesSpaces(item.getLocalita()) + "(" + GeneralUtil.removeLinesSpaces(item.getProvincia()) + ")");
        holder.tipologia.setText(GeneralUtil.removeLinesSpaces(item.getTipologia()));

        String data_inizio = item.getData_inizio();
        String data_fine = item.getData_fine();

        String data = "";

        if(data_fine == null)
        {
            data = data_inizio;
        }

        else
        {
            data = "Dal " + data_inizio + " al " + data_fine;
        }

        holder.data.setText(GeneralUtil.removeLinesSpaces(data));

        holder.descrizione.setText(GeneralUtil.removeLinesSpaces(item.getDescrizione()));

        String latitudine = item.getGeo_latitudine();
        String longitudine = item.getGeo_longitudine();

        if(item.getMetri() > 1000)
        {
            holder.kmPosizione.setText((item.getMetri() / 1000) + " km");
        }
        else if(item.getMetri() == 1000)
        {
            holder.kmPosizione.setText("1 km");
        }
        else
        {
            holder.kmPosizione.setText(item.getMetri() + " m");
        }


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

                Intent intent = new Intent(mContext, DettaglioCosaFareActivity.class);
                intent.putExtra("idCosaFare",String.valueOf(item.getId()));
                mContext.startActivity(intent);

            }
        });

    }


    @Override
    public int getItemCount() {
        return mValues.size();
    }

    public void addItem(int position, CosaFare data) {
        mValues.add(position, data);
        notifyItemInserted(position);
    }

    public void addAll(ArrayList<CosaFare> items) {
        mValues.clear();

        for (int i = 0; i < items.size(); i++) {
            mValues.add(items.get(i));
        }

        notifyDataSetChanged();
    }

    public void clearData() {
        mValues.clear();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {
        public RelativeLayout rlMain;
        private ImageView image;
        private TextView nome, data, descrizione, localita, kmPosizione,tipologia;

        public ViewHolder(View view) {
            super(view);
            rlMain = view.findViewById(R.id.rlMain);
            nome = view.findViewById(R.id.nome);
            data = view.findViewById(R.id.data);
            tipologia = view.findViewById(R.id.tipologia);
            descrizione = view.findViewById(R.id.descrizione);
            localita = view.findViewById(R.id.localita);
            kmPosizione = view.findViewById(R.id.kmposizione);
            image = view.findViewById(R.id.image);

        }
    }
}
android android-framelayout
1个回答
0
投票

在xml内尝试以下框架布局类-

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.widget.FrameLayout;

public class RoundedCornerFrameLayout extends FrameLayout {
private final static float CORNER_RADIUS = 40.0f;

private Bitmap maskBitmap;
private Paint paint, maskPaint;
private float cornerRadius;

public RoundedCornerFrameLayout(Context context) {
    super(context);
    init(context, null, 0);
}

public RoundedCornerFrameLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs, 0);
}

public RoundedCornerFrameLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context, attrs, defStyle);
}

private void init(Context context, AttributeSet attrs, int defStyle) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, CORNER_RADIUS, metrics);

    paint = new Paint(Paint.ANTI_ALIAS_FLAG);

    maskPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
    maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

    setWillNotDraw(false);
}

@Override
public void draw(Canvas canvas) {
    Bitmap offscreenBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas offscreenCanvas = new Canvas(offscreenBitmap);

    super.draw(offscreenCanvas);

    if (maskBitmap == null) {
        maskBitmap = createMask(canvas.getWidth(), canvas.getHeight());
    }

    offscreenCanvas.drawBitmap(maskBitmap, 0f, 0f, maskPaint);
    canvas.drawBitmap(offscreenBitmap, 0f, 0f, paint);
}

private Bitmap createMask(int width, int height) {
    Bitmap mask = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8);
    Canvas canvas = new Canvas(mask);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.WHITE);

    canvas.drawRect(0, 0, width, height, paint);

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    canvas.drawRoundRect(new RectF(0, 0, width, height), cornerRadius, cornerRadius, paint);

    return mask;
}

}

像这样在xml中使用它-

<com.example.RoundedCornerFrameLayout
    android:layout_width="250dp"
    android:layout_height="250dp">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</com.example.RoundedCornerFrameLayout>
© www.soinside.com 2019 - 2024. All rights reserved.