스트리밍 레이아웃 구현
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="FlowView">
<attr name="pLeft" format="dimension"/>
<attr name="pRight" format="dimension"/>
<attr name="pTop" format="dimension"/>
<attr name="pBottom" format="dimension"/>
<attr name="hDiver" format="dimension"/>
<attr name="lDiver" format="dimension"/>
<attr name="itemLayout" format="reference"/>
<attr name="addLayout" format="reference"/>
</declare-styleable>
</resources>
2, 사용할 세 개의 레이아웃 파일 1) 일반 item 옵션의 레이아웃 파일
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/background_item">
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dip" android:textColor="#FFFFFF" android:text="TextView" />
</RelativeLayout>
2) add 항목의 레이아웃 파일
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/background_add">
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dip" android:textColor="#FFFFFF" android:text="TextView" />
</RelativeLayout>
3)main 레이아웃 파일
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.example.flowingdemo"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.flowingdemo.view.FlowView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:pLeft="20dip"
app:pRight="20dip"
app:pTop="20dip"
app:pBottom="20dip"
app:hDiver="20dip"
app:lDiver="20dip"
app:itemLayout="@layout/flow_item_layout"
app:addLayout="@layout/flow_add_layout"
android:id="@+id/flowview" />
</RelativeLayout>
3, 자동 FlowView, View Group 상속, OnClick 인터페이스 구현
package com.example.flowingdemo.view;
import java.util.ArrayList;
import java.util.List;
import com.example.flowingdemo.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
/* * match_parent */
public class FlowView extends ViewGroup implements OnClickListener {
// item
private int itemLayout = 0;
// add
private int addLayout = 0;
//
private int totalWidth = 0, totalHeight = 0;
//
private int hangJiJian = 20;
//
private int lieJianJu = 20;
//
private int leftJianJu = 20, rightJianJu = 20, topJianJu = 20,
bottomJianJu = 20;
// Add
private boolean isTianJiaAdd = false;
//
private List<String> list = new ArrayList<String>();
public FlowView(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
this(context, attrs);
}
public FlowView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs);
}
public FlowView(Context context, AttributeSet attrs) {
super(context, attrs);
final TypedArray typedArray = context.obtainStyledAttributes(attrs,
R.styleable.FlowView);
itemLayout = typedArray.getResourceId(R.styleable.FlowView_itemLayout,
R.layout.flow_item_layout);
addLayout = typedArray.getResourceId(R.styleable.FlowView_addLayout,
R.layout.flow_add_layout);
leftJianJu = (int) typedArray.getDimension(R.styleable.FlowView_pLeft,
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
leftJianJu, getResources().getDisplayMetrics()));
rightJianJu = (int) typedArray.getDimension(
R.styleable.FlowView_pRight, (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, rightJianJu,
getResources().getDisplayMetrics()));
topJianJu = (int) typedArray.getDimension(R.styleable.FlowView_pTop,
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
topJianJu, getResources().getDisplayMetrics()));
bottomJianJu = (int) typedArray.getDimension(
R.styleable.FlowView_pBottom, (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, bottomJianJu,
getResources().getDisplayMetrics()));
hangJiJian = (int) typedArray.getDimension(R.styleable.FlowView_hDiver,
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
hangJiJian, getResources().getDisplayMetrics()));
lieJianJu = (int) typedArray.getDimension(R.styleable.FlowView_lDiver,
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
lieJianJu, getResources().getDisplayMetrics()));
typedArray.recycle();
}
public FlowView(Context context) {
this(context, null);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
// int widthMode = MeasureSpec.getMode(widthMeasureSpec);
// int heightMode = MeasureSpec.getMode(heightMeasureSpec);
totalWidth = widthSize;
totalHeight = heightSize;
measureChildren(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(widthSize, heightSize);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int count = getChildCount();
// x
int xp = leftJianJu, yp = topJianJu;
for (int i = 0; i < count; i++) {
View childView = getChildAt(i);
int cw = childView.getMeasuredWidth();
int ch = childView.getMeasuredHeight();
int xl = 0, xt = 0, xr = 0, xb = 0;
if (xp + cw + hangJiJian + rightJianJu >= totalWidth) {
//
yp += ch + lieJianJu;
xp = leftJianJu;
}
if (count - 1 == i && isTianJiaAdd) {
// , add add
xl = totalWidth - rightJianJu - cw;
xt = yp;
xr = xl + cw;
xb = xt + ch;
} else {
//
xl = xp;
xt = yp;
xr = xl + cw;
xb = xt + ch;
}
xp += cw + hangJiJian;
childView.layout(xl, xt, xr, xb);
}
}
//
public void addView(String message, int type) {
int layout = 0;
if (type == 1) {
// item
layout = itemLayout;
} else if (type == 2) {
// add
if (isTianJiaAdd) {
return;
}
//
isTianJiaAdd = true;
layout = addLayout;
}
RelativeLayout relativeLayout = (RelativeLayout) View.inflate(
getContext(), layout, null);
TextView textView = (TextView) relativeLayout
.findViewById(R.id.textView1);
textView.setLines(1);
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setMaxLines(1);
textView.setText(message);
relativeLayout.setOnClickListener(this);
if (type == 1) {
relativeLayout.setTag(list.size());
relativeLayout.setId(123);
} else {
relativeLayout.setTag(123);
relativeLayout.setId(123);
}
if (isTianJiaAdd && type == 1) {
addView(relativeLayout, list.size() - 1);
list.add(list.size() - 1, message);
} else {
addView(relativeLayout);
list.add(message);
}
requestLayout();
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case 123:
int position = (Integer) v.getTag();
if (position == 123) {
if (onClickFlowView != null) {
onClickFlowView.onClickAdd();
}
} else {
if (onClickFlowView != null) {
onClickFlowView.onClickItem(position, list.get(position));
}
}
break;
default:
break;
}
}
public interface OnClickFlowView {
public void onClickAdd();
public void onClickItem(int position, String message);
}
private OnClickFlowView onClickFlowView;
// ----------
public void setOnClickFlowView(OnClickFlowView onClickFlowView) {
this.onClickFlowView = onClickFlowView;
}
public void setPLeft(int PLeft) {
this.leftJianJu = PLeft;
this.requestLayout();
}
public void setPRight(int PRight) {
this.leftJianJu = PRight;
this.requestLayout();
}
public void setPTop(int PTop) {
this.leftJianJu = PTop;
this.requestLayout();
}
public void setPBottom(int PBottom) {
this.leftJianJu = PBottom;
this.requestLayout();
}
public void setHDiver(int hDiver) {
this.leftJianJu = hDiver;
this.requestLayout();
}
public void setLDiver(int lDiver) {
this.leftJianJu = lDiver;
this.requestLayout();
}
}
4, MainActivity의 실현
package com.example.flowingdemo;
import com.example.flowingdemo.view.FlowView;
import com.example.flowingdemo.view.FlowView.OnClickFlowView;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickFlowView {
private FlowView flowview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_main);
flowview = (FlowView) findViewById(R.id.flowview);
flowview.setOnClickFlowView(this);
for (int i = 0; i < 10; i++) {
String s = "";
for (int j = 0; j < i; j++) {
s += String.valueOf(j);
}
flowview.addView("i->" + s + i, 1);
}
// add
flowview.addView("add", 2);
}
@Override
public void onClickAdd() {
flowview.addView("moren", 1);
}
@Override
public void onClickItem(int position, String message) {
Toast.makeText(this, "position=" + position + "-------->" + message,
Toast.LENGTH_SHORT).show();
}
}
소스 코드 다운로드 주소
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.