Android listView 头部添加透明titleBar

﹏ヽ暗。殇╰゛Y 2022-08-18 15:28 280阅读 0赞

效果图如下

Center

activity布局:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context="com.npi.blureffect.ListViewActivity" >
  6. <ListView
  7. android:id="@+id/listView1"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:layout_alignParentLeft="true" >
  11. </ListView>
  12. <com.npi.blureffect.ScrollableImageView
  13. android:id="@+id/blurred_image_header"
  14. android:layout_width="match_parent"
  15. android:layout_height="50dp"
  16. android:background="#e8e8e8" />
  17. </RelativeLayout>

listView里的单个布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <ImageView
  6. android:id="@+id/imageView1"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:layout_alignParentLeft="false"
  10. android:layout_alignParentRight="false"
  11. android:layout_alignParentTop="false"
  12. android:layout_centerVertical="true"
  13. android:src="@drawable/demo02" />
  14. <Button
  15. android:id="@+id/button1"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:layout_alignParentRight="true"
  19. android:layout_centerVertical="true"
  20. android:layout_marginRight="20dp"
  21. android:text="Button" />
  22. </RelativeLayout>

listView的header的布局,这里应该和头部的模糊view一样

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context="com.npi.blureffect.ListViewActivity" >
  6. <com.npi.blureffect.ScrollableImageView
  7. android:id="@+id/blurred_image_header"
  8. android:layout_width="match_parent"
  9. android:layout_height="50dp"
  10. android:background="#e8e8e8" />
  11. </RelativeLayout>

activity代码

  1. package com.npi.blureffect;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.zip.Inflater;
  5. import com.situ.android.adapter.CommonAdapter;
  6. import com.situ.android.adapter.ViewHolder;
  7. import android.app.Activity;
  8. import android.graphics.Bitmap;
  9. import android.graphics.Bitmap.Config;
  10. import android.graphics.Canvas;
  11. import android.os.Bundle;
  12. import android.util.Log;
  13. import android.view.LayoutInflater;
  14. import android.view.Menu;
  15. import android.view.MenuItem;
  16. import android.view.View;
  17. import android.view.View.MeasureSpec;
  18. import android.widget.AbsListView;
  19. import android.widget.AbsListView.OnScrollListener;
  20. import android.widget.ImageView;
  21. import android.widget.ListView;
  22. public class ListViewActivity extends Activity {
  23. ScrollableImageView header;
  24. ListView listView;
  25. Bitmap screen;
  26. View listHeader;
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_list_view);
  31. listView = (ListView) findViewById(R.id.listView1);
  32. header = (ScrollableImageView) findViewById(R.id.blurred_image_header);
  33. List<Integer> contents = new ArrayList<Integer>();
  34. contents.add(R.drawable.demo01);
  35. contents.add(R.drawable.demo02);
  36. contents.add(R.drawable.demo03);
  37. contents.add(R.drawable.demo04);
  38. contents.add(R.drawable.demo05);
  39. contents.add(R.drawable.demo06);
  40. contents.add(R.drawable.demo07);
  41. contents.add(R.drawable.demo08);
  42. contents.add(R.drawable.demo09);
  43. contents.add(R.drawable.demo10);
  44. contents.add(R.drawable.demo11);
  45. contents.add(R.drawable.demo12);
  46. contents.add(R.drawable.demo13);
  47. contents.add(R.drawable.demo14);
  48. contents.add(R.drawable.demo15);
  49. listView.setAdapter(new CommonAdapter(ListViewActivity.this,R.layout.list_activity_item,contents) {
  50. @Override
  51. public void convert(ViewHolder holder, int position, Object object) {
  52. // TODO Auto-generated method stub
  53. ImageView img = (ImageView)holder.getView(R.id.imageView1);
  54. img.setImageResource((Integer)object);
  55. }
  56. });
  57. initListView(listView, header);
  58. }
  59. int totalHeight=0;
  60. int initHeight = 0;
  61. private void initListView(final ListView listView,final ScrollableImageView header){
  62. LayoutInflater inflater = getLayoutInflater();
  63. listHeader = inflater.inflate(R.layout.list_header, null);
  64. listView.addHeaderView(listHeader);
  65. listView.setOnScrollListener(new OnScrollListener() {
  66. int X = 0;
  67. int Y = 0;
  68. int height = 0;
  69. /**
  70. * 获取当前滑动的精准位置,仅能用于行高均相同的listview
  71. * @param mListView
  72. * @return
  73. */
  74. public int getScrollY(final AbsListView mListView) {
  75. mListView.post(new Runnable() {
  76. @Override
  77. public void run() {
  78. // TODO Auto-generated method stub
  79. View c = mListView.getChildAt(0);
  80. if (c == null) {
  81. return ;
  82. }
  83. int firstVisiblePosition = mListView.getFirstVisiblePosition();
  84. int top = c.getTop();
  85. // Log.i("Alex", "子元素的top是"+top+"头的高度是"+listHeader.getHeight()+" :"+listHeader.getMeasuredHeight());
  86. //重中之重的方法!!!!!!!!!!!!!!!!!!!!!!!
  87. Log.i("Alex", "计算结果是 "+top+"+"+(firstVisiblePosition-1)+" *"+c.getHeight()+" +"+listHeader.getHeight()+" :"+listHeader.getMeasuredHeight());
  88. if(c.getHeight()==listHeader.getHeight()){
  89. height = -top + (firstVisiblePosition) * c.getHeight() ;
  90. }else{
  91. height = -top + (firstVisiblePosition-1) * c.getHeight()+listHeader.getHeight() ;
  92. }
  93. }
  94. });
  95. return height;
  96. }
  97. @Override
  98. public void onScrollStateChanged(AbsListView view, int scrollState) {
  99. // TODO Auto-generated method stub
  100. Log.i("Alex", "listView滚动状态改变了:::"+scrollState);
  101. switch(scrollState){
  102. case OnScrollListener.SCROLL_STATE_IDLE://空闲状态
  103. Log.i("Alex", "现在是空闲状态");
  104. break;
  105. case OnScrollListener.SCROLL_STATE_FLING://滚动状态
  106. Log.i("Alex", "现在是滚动状态");
  107. break;
  108. case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL://触摸后滚动
  109. Log.i("Alex", "现在是惯性状态");
  110. break;
  111. }
  112. }
  113. @Override
  114. public void onScroll(AbsListView view, int firstVisibleItem,
  115. int visibleItemCount, int totalItemCount) {
  116. // TODO Auto-generated method stub
  117. // Log.i("Alex", "正在滚动。。第一个可见item是"+firstVisibleItem+" 可见item的数量是"+visibleItemCount+" /"+totalItemCount);
  118. // X = listView.getScrollX();
  119. Y = getScrollY(view);
  120. if(Y<initHeight){
  121. Log.i("Alex", "现在是刚进来");
  122. }
  123. if(Y>initHeight && Y >totalHeight-listHeader.getHeight()){
  124. Log.i("Alex", "正在重新截图。。。................................................................................。。。。。。。。。。。。");
  125. view.post(new Runnable() {
  126. @Override
  127. public void run() {
  128. // TODO Auto-generated method stub
  129. Bitmap subScreen = Blur.fastblur(ListViewActivity.this, getbBitmap(listView), 15);
  130. screen = concactBitmapVertical(screen, subScreen);
  131. subScreen.recycle();//消除内存
  132. totalHeight = screen.getHeight();
  133. header.setoriginalImage(screen);
  134. }
  135. });
  136. }
  137. Log.i("Alex", "现在要显示到:"+Y);
  138. header.handleScroll(Y, 0);
  139. }
  140. });
  141. listView.post(new Runnable() {
  142. @Override
  143. public void run() {
  144. // TODO Auto-generated method stub
  145. screen = getbBitmap(listView);
  146. initHeight = screen.getHeight();
  147. screen = Blur.fastblur(ListViewActivity.this, screen, 15);
  148. totalHeight = screen.getHeight();
  149. header.setoriginalImage(screen);
  150. }
  151. });
  152. }
  153. /**
  154. * 截图listview,这个截图方法有bug,在快速滑动和慢速滑动的时候截图结果不同
  155. * **/
  156. public static Bitmap getbBitmap(ListView listView) {
  157. int h = 0;
  158. Bitmap bitmap = null;
  159. // 获取listView实际高度
  160. Log.i("Alex", "子元素数量是"+listView.getChildCount());
  161. for (int i = 0; i < listView.getChildCount(); i++) {
  162. h += listView.getChildAt(i).getHeight();
  163. }
  164. Log.d("Alex", "实际高度:" + h);
  165. Log.d("Alex", "list 高度:" + listView.getHeight());
  166. // 创建对应大小的bitmap
  167. bitmap = Bitmap.createBitmap(listView.getWidth(), h,
  168. Bitmap.Config.ARGB_8888);
  169. final Canvas canvas = new Canvas(bitmap);
  170. listView.draw(canvas);
  171. return bitmap;
  172. }
  173. /**
  174. * 这个方法不能用于listView中的contentView,不然被测量之前的contentVIew就都没了
  175. * @param view
  176. * @return
  177. */
  178. public static Bitmap convertViewToBitmap(View view) {
  179. view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
  180. MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
  181. view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
  182. view.buildDrawingCache();
  183. Bitmap bitmap = view.getDrawingCache();
  184. if (bitmap != null) {
  185. System.out.println("这不是nullde1");
  186. Log.d("nullde1", "nullde1");
  187. } else {
  188. System.out.println("这nullnulllnulnlul");
  189. }
  190. return bitmap;
  191. }
  192. /**
  193. * 将两张位图拼接成一张(横向拼接)
  194. *
  195. * @param first
  196. * @param second
  197. * @return
  198. */
  199. private Bitmap concactBitmapHorizantal(Bitmap first, Bitmap second) {
  200. int width =first.getWidth() + second.getWidth();
  201. int height = Math.max(first.getHeight(), second.getHeight());
  202. Bitmap result = Bitmap.createBitmap(width, height, Config.ARGB_8888);
  203. Canvas canvas = new Canvas(result);
  204. canvas.drawBitmap(first, 0, 0, null);
  205. canvas.drawBitmap(second, first.getWidth(), 0, null);
  206. return result;
  207. }
  208. /**
  209. * 将两张位图拼接成一张(横向拼接)
  210. *
  211. * @param first
  212. * @param second
  213. * @return
  214. */
  215. private Bitmap concactBitmapVertical(Bitmap first, Bitmap second) {
  216. int width =Math.max(first.getWidth(), second.getWidth());
  217. int height = first.getHeight()+second.getHeight();
  218. Bitmap result = Bitmap.createBitmap(width, height, Config.ARGB_4444);
  219. Canvas canvas = new Canvas(result);
  220. canvas.drawBitmap(first, 0, 0, null);//先画第一个
  221. canvas.drawBitmap(second, 0, first.getHeight(), null);//在第一个的下面画第二个
  222. return result;
  223. }
  224. }

发表评论

表情:
评论列表 (有 0 条评论,280人围观)

还没有评论,来说两句吧...

相关阅读