Fragmentからユーザ情報画面への遷移処理について説明します。
ユーザ情報画面では、UIの美しさを高めるためにアバター画像を円形に切り抜く実装を行いました。
円形画像表示用のカスタムビュー「RoundImageView」の実装:
package com.example.fuxing.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import androidx.appcompat.widget.AppCompatImageView;
public class RoundImageView extends AppCompatImageView {
public RoundImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public RoundImageView(Context context) {
super(context);
init();
}
private final RectF roundRect = new RectF();
private float rect_adius = 90;
private final Paint maskPaint = new Paint();
private final Paint zonePaint = new Paint();
private void init() {
maskPaint.setAntiAlias(true);
maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
maskPaint.setFilterBitmap(true);
zonePaint.setAntiAlias(true);
zonePaint.setColor(Color.WHITE);
zonePaint.setFilterBitmap(true);
float density = getResources().getDisplayMetrics().density;
rect_adius = rect_adius * density;
}
public void setRectAdius(float adius) {
rect_adius = adius;
invalidate();
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
int w = getWidth();
int h = getHeight();
roundRect.set(0, 0, w, h);
}
@Override
public void draw(Canvas canvas) {
canvas.saveLayer(roundRect, zonePaint, Canvas.ALL_SAVE_FLAG);
canvas.drawRoundRect(roundRect, rect_adius, rect_adius, zonePaint);
canvas.saveLayer(roundRect, maskPaint, Canvas.ALL_SAVE_FLAG);
super.draw(canvas);
canvas.restore();
}
}
アイテムグループを表現するカスタムビュー「ItemGroup.java」:
package com.example.fuxing.widget;
import android.content.Context;
import android.content.Intent;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.AttrRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.example.fuxing.Fragment_3;
import com.example.fuxing.MainActivity;
import com.example.fuxing.R;
import com.example.fuxing.UserActivity;
public class ItemGroup extends FrameLayout {
private LinearLayout itemGroupLayout;
private TextView titleTv;
private TextView contentEdt;
private ImageView jtRightIv;
public TextView getContentEdt() {
return contentEdt;
}
public ItemGroup(@NonNull Context context) {
super(context);
initView(context);
}
public ItemGroup(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView(context);
initAttrs(context, attrs);
}
public ItemGroup(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
initAttrs(context, attrs);
}
private void initView(Context context) {
View view = LayoutInflater.from(context).inflate(R.layout.activity_item_group, null);
itemGroupLayout = (LinearLayout) view.findViewById(R.id.item_group_layout);
titleTv = (TextView) view.findViewById(R.id.title_tv);
contentEdt = (TextView) view.findViewById(R.id.content_edt);
jtRightIv = (ImageView) view.findViewById(R.id.jt_right_iv);
addView(view);
}
private void initAttrs(Context context, AttributeSet attrs) {
int defaultTitleColor = context.getResources().getColor(R.color.gray3);
int defaultEdtColor = context.getResources().getColor(R.color.black);
int defaultHintColor = context.getResources().getColor(R.color.gray3);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ItemGroup);
String title = typedArray.getString(R.styleable.ItemGroup_title);
float paddingLeft = typedArray.getDimension(R.styleable.ItemGroup_paddingLeft, 15);
float paddingRight = typedArray.getDimension(R.styleable.ItemGroup_paddingRight, 15);
float paddingTop = typedArray.getDimension(R.styleable.ItemGroup_paddingTop, 5);
float paddingBottom = typedArray.getDimension(R.styleable.ItemGroup_paddingTop, 5);
float titleSize = typedArray.getDimension(R.styleable.ItemGroup_title_size, 15);
int titleColor = typedArray.getColor(R.styleable.ItemGroup_title_color, defaultTitleColor);
String content = typedArray.getString(R.styleable.ItemGroup_edt_content);
float contentSize = typedArray.getDimension(R.styleable.ItemGroup_edt_text_size, 13);
int contentColor = typedArray.getColor(R.styleable.ItemGroup_edt_text_color, defaultEdtColor);
String hintContent = typedArray.getString(R.styleable.ItemGroup_edt_hint_content);
int hintColor = typedArray.getColor(R.styleable.ItemGroup_edt_hint_text_color, defaultHintColor);
boolean isEditable = typedArray.getBoolean(R.styleable.ItemGroup_isEditable, true);
boolean showJtIcon = typedArray.getBoolean(R.styleable.ItemGroup_jt_visible, true);
typedArray.recycle();
itemGroupLayout.setPadding((int) paddingLeft, (int) paddingTop, (int) paddingRight, (int) paddingBottom);
titleTv.setText(title);
titleTv.setTextSize(titleSize);
titleTv.setTextColor(titleColor);
contentEdt.setText(content);
contentEdt.setTextSize(contentSize);
contentEdt.setTextColor(contentColor);
contentEdt.setHint(hintContent);
contentEdt.setHintTextColor(hintColor);
jtRightIv.setVisibility(showJtIcon ? View.VISIBLE : View.GONE);
}
}
タイトルバーのカスタムビュー「TitleLayout.java」:
package com.example.fuxing.widget;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.fuxing.LoginActivity;
import com.example.fuxing.R;
import com.example.fuxing.RegisterActivity;
public class TitleLayout extends LinearLayout {
private ImageView iv_backward;
private TextView tv_title, tv_forward;
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
LinearLayout bar_title = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.activity_title, this);
iv_backward = (ImageView) bar_title.findViewById(R.id.iv_backward);
tv_title = (TextView) bar_title.findViewById(R.id.tv_title);
tv_forward = (TextView) bar_title.findViewById(R.id.tv_forward);
iv_backward.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((Activity) getContext()).finish();
}
});
}
}
上記の3つのファイルはすべて「widget」パッケージに格納されています。