Android ListView 슬라이딩 제목 표시 줄 배경 그 라 데 이 션 효과 변경
12150 단어 AndroidListView배경 그 라 데 이 션
그림 1:
그림 2:
그림 3:
그림 4:
제 가 사용 하 는 것 은 샤 오미 노트 핸드폰 입 니 다.상태 표시 줄 높이 는 55px 입 니 다.나중에 언급 할 것 입 니 다.여기 서 먼저 설명 하 겠 습 니 다.
아래 의 내용 은 모든 코드 와 테스트 데 이 터 를 포함 합 니 다.
코드:
코드 도 간단 하고 주석 도 달 았 으 니 여 기 는 쓸데없는 말 이 아니다.
먼저 파일 레이아웃:
activity 레이아웃
activity_main_10
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/listvew"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!-- , textview-->
<TextView
android:id="@+id/title_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00000000"
android:gravity="center"
android:orientation="vertical"
android:padding="5dp"
android:textSize="30sp"/>
</RelativeLayout>
listView 헤드 레이아웃head_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/head_iv"
android:layout_width="match_parent"
android:layout_height="150dp"
android:background="@mipmap/ch"/>
</LinearLayout>
listView 의 item 레이아웃listview_item_layout
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:id="@+id/item_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="15sp">
</TextView>
</FrameLayout>
기능 코드:MainActivity10
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity10 extends Activity {
private TextView title_tv;
private ListView listvew;
//listView
private View headView;
//listView 。 ImageView
private ImageView head_iv;
private ArrayList<String> dataList;
private MyAdapter myAdapter;
//listview ( ImageView) ( )
// : , , ,
private int height;
//listView 。 , demo ImageView , ImageView ,
private int headViewHeight;
private Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_10);
context = this;
title_tv = (TextView) findViewById(R.id.title_tv);
listvew = (ListView) findViewById(R.id.listvew);
headView = LayoutInflater.from(this).inflate(R.layout.head_layout, null);
head_iv = (ImageView) headView.findViewById(R.id.head_iv);
// listView
listvew.addHeaderView(headView);
dataList = new ArrayList<>();
for (int i = 0; i < 50; i++) {
dataList.add("==" + i + "==");
}
myAdapter = new MyAdapter();
listvew.setAdapter(myAdapter);
listvew.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int location[] = new int[2];
/**
* public void getLocationInWindow(@Size(2) int[] location)
*
* <p>Computes the coordinates of this view in its window. The argument
* must be an array of two integers. After the method returns, the array
* contains the x and y location in that order.</p>
*
* @param location an array of two integers in which to hold the coordinates
*/
head_iv.getLocationInWindow(location);
//listview ( ImageView) ( )
height = location[1];
headViewHeight = head_iv.getHeight();
Utils.printLogData("==location==0==" + location[0]);
Utils.printLogData("==location==1==" + location[1]);
Utils.printLogData("==height==" + height);
Utils.printLogData("==headViewHeight==" + headViewHeight);
// head_layout.xml , 150dp ,
Utils.printLogData("==setHeigth==" + dip2px(150));
handleTitleBarColorEvaluate();
}
});
}
//
private void handleTitleBarColorEvaluate() {
//
float fraction;
if (height > 0) {
fraction = 1f - height * 1f / 60;
if (fraction < 0f) {
fraction = 0f;
}
title_tv.setAlpha(fraction);
return;
}
// , ,
float space = Math.abs(height) * 1f;
//
fraction = space / headViewHeight;
if (fraction < 0f)
fraction = 0f;
if (fraction > 1f)
fraction = 1f;
title_tv.setAlpha(1f);
if (fraction >= 1f) {
title_tv.setBackgroundColor(0xffec434b);
} else {
// ,
title_tv.setBackgroundColor(ChenColorUtils.getNewColorByStartEndColor(context, fraction, R.color.transparent, R.color.red));
}
if (fraction >= 0.8f) {
title_tv.setTextColor(ChenColorUtils.getNewColorByStartEndColor(context, fraction, R.color.transparent, R.color.black));
title_tv.setText(" ");
} else {
title_tv.setText("");
}
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return dataList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.listview_item_layout, null);
holder = new ViewHolder();
holder.item_tv = (TextView) convertView.findViewById(R.id.item_tv);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.item_tv.setText(dataList.get(position));
return convertView;
}
private class ViewHolder {
private TextView item_tv;
}
}
/**
* dip px
*/
public int dip2px(int dip) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dip * scale + 0.5f);
}
}
색상:colors.xml 에 추가
<color name="red">#ec434b</color>
<color name="transparent">#00000000</color>
<color name="black">#FF000000</color>
도구 종류 코드:인쇄 로그 도구:
import android.util.Log;
public class Utils {
public static void printLogData(String data) {
Log.e("chen", data);
}
}
색상 도구:
import android.content.Context;
public class ChenColorUtils {
//
public static int getNewColorByStartEndColor(Context context, float fraction, int startValue, int endValue) {
return evaluate(fraction, context.getResources().getColor(startValue), context.getResources().getColor(endValue));
}
/**
*
* @param fraction (0.0f ~ 1.0f)
* @param startValue
* @param endValue
* @return
*/
public static int evaluate(float fraction, int startValue, int endValue) {
int startA = (startValue >> 24) & 0xff;
int startR = (startValue >> 16) & 0xff;
int startG = (startValue >> 8) & 0xff;
int startB = startValue & 0xff;
int endA = (endValue >> 24) & 0xff;
int endR = (endValue >> 16) & 0xff;
int endG = (endValue >> 8) & 0xff;
int endB = endValue & 0xff;
return ((startA + (int) (fraction * (endA - startA))) << 24) |
((startR + (int) (fraction * (endR - startR))) << 16) |
((startG + (int) (fraction * (endG - startG))) << 8) |
((startB + (int) (fraction * (endB - startB))));
}
}
테스트 데이터:인터페이스 가 막 시작 되 었 다.
05-18 16:19:25.386 18718-18718/com.chen E/chen: ==location==0==0
05-18 16:19:25.387 18718-18718/com.chen E/chen: ==location==1==0
05-18 16:19:25.387 18718-18718/com.chen E/chen: ==height==0
05-18 16:19:25.387 18718-18718/com.chen E/chen: ==headViewHeight==0
05-18 16:19:25.387 18718-18718/com.chen E/chen: ==setHeigth==413
시간 적 으로 약 150 밀리초(0.15 초)가동 후
05-18 16:19:25.531 18718-18718/com.chen E/chen: ==location==0==0
05-18 16:19:25.531 18718-18718/com.chen E/chen: ==location==1==55
05-18 16:19:25.531 18718-18718/com.chen E/chen: ==height==55
05-18 16:19:25.531 18718-18718/com.chen E/chen: ==headViewHeight==413
05-18 16:19:25.531 18718-18718/com.chen E/chen: ==setHeigth==413
샤 오미 노트,상태 표시 줄 높이 는 55 픽 셀 입 니 다.그래서 처음에 그림 이 화면 상단 높이 에서 55 였 어 요.
위로 미 끄 러 지고 화면 밖으로 레이아웃 이 완전히 나 온 후에 계속 미 끄 러 지 며 인쇄 데 이 터 는 변 하지 않 습 니 다.
즉,머리 레이아웃 상단 거 리 는 화면 상단 의 높이(거리)가 변 하지 않 습 니 다.이 높이 때문에 view 에서 만 화면 에서 얻 을 수 있 습 니 다.
상세 한 것 은 주석 을 보십시오.
05-18 17:01:02.151 16873-16873/com.chen E/chen: ==height==-412
05-18 17:01:02.167 16873-16873/com.chen E/chen: ==height==-412
05-18 17:01:02.200 16873-16873/com.chen E/chen: ==height==-412
05-18 17:01:02.233 16873-16873/com.chen E/chen: ==height==-412
05-18 17:01:02.316 16873-16873/com.chen E/chen: ==height==-412
05-18 17:01:02.332 16873-16873/com.chen E/chen: ==height==-412
05-18 17:01:02.349 16873-16873/com.chen E/chen: ==height==-412
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.