Android仿QQ可拉伸頭部控件
本文實(shí)例為大家分享了Android仿QQ可拉伸頭部控件的具體實(shí)現(xiàn)代碼,供大家參考,具體內(nèi)容如下
該控件大致思路:
1.采用繼承l(wèi)istview加入頭部view。
2.監(jiān)聽listview滾動。
3.自定義動畫回彈。
先看效果吧:
activity-main.xml布局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context=".MainActivity" > <com.example.headerlistview.HeaderListView android:id="@+id/header_lv" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@android:color/transparent" android:divider="@android:color/darker_gray" android:dividerHeight="1dip" android:duplicateParentState="true" android:scrollbars="none" > </com.example.headerlistview.HeaderListView> </LinearLayout>
headerview.xml布局:
<?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/header_image" android:layout_width="match_parent" android:layout_height="150dip" android:scaleType="centerCrop" android:src="@drawable/lifei987" /> </LinearLayout>
list_item布局:
<?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="80dip" android:gravity="center_vertical" android:orientation="horizontal" > " <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <LinearLayout android:layout_width="match_parent" android:layout_height="80dip" android:layout_marginLeft="10dip" android:orientation="vertical" > <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:text="lifei" /> <TextView android:id="@+id/tv_describe" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:text="lifeiasdfasdfasfsadfasf" /> </LinearLayout> </LinearLayout>
activity代碼:
package com.example.headerlistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.os.Bundle; import android.app.Activity; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.SimpleAdapter; public class MainActivity extends Activity { private HeaderListView header_lv; private ImageView header_iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getHeaderView(); initView(); } private void initView() { // TODO Auto-generated method stub header_lv=(HeaderListView) findViewById(R.id.header_lv); header_lv.addHeaderView(getHeaderView()); header_lv.setHeaderView(header_iv); header_lv.setAdapter(getSimpleAdapter()); } public BaseAdapter getSimpleAdapter(){ List<Map<String, Object>> data=new ArrayList<Map<String,Object>>(); for(int i=0;i<15;i++){ Map<String, Object> map=new HashMap<String, Object>(); map.put("name", "鄭州___"+i); map.put("describe", "asdfasdfasdfasdfasdfsadfsad"); data.add(map); } SimpleAdapter simpleAdapter=new SimpleAdapter(this, data, R.layout.list_item, new String[]{"name","describe"}, new int[]{R.id.tv_name,R.id.tv_describe}); return simpleAdapter; } public View getHeaderView(){ View view= getLayoutInflater().inflate(R.layout.headerview, null); header_iv =(ImageView) view.findViewById(R.id.header_image); return view; } }
自定義控件HeaderListView:
package com.example.headerlistview; import java.security.spec.ECField; import android.annotation.SuppressLint; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.Animation; import android.view.animation.Transformation; import android.widget.ImageView; import android.widget.ListView; public class HeaderListView extends ListView { private ImageView headerView; private int headerView_initHeight;//imageview初始高度 public void setHeaderView(ImageView headerView) { this.headerView = headerView; } public HeaderListView(Context context) { super(context); // TODO Auto-generated constructor stub } public HeaderListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public HeaderListView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } /** * listview焦點(diǎn)改變時--獲取iamgeview高度的初始值,該值不能在構(gòu)造方法中獲取 */ @Override public void onWindowFocusChanged(boolean hasWindowFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasWindowFocus); if(hasWindowFocus){ this.headerView_initHeight=headerView.getHeight(); } } @SuppressLint("NewApi") @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { // 滑動過頭的時候調(diào)用 boolean bl=resizeHeaderView(deltaY); return bl?true:super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); } /** * 控制imageview高度的增加 * @param deltaY 偏移量 */ private boolean resizeHeaderView(int deltaY) { if(Math.abs((double)deltaY)<200){ if(deltaY<0){ headerView.getLayoutParams().height=headerView.getHeight()-deltaY; //重新繪制 headerView.requestLayout(); }else{ headerView.getLayoutParams().height=headerView.getHeight()-deltaY; headerView.requestLayout(); } } return false; } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { // TODO Auto-generated method stub super.onScrollChanged(l, t, oldl, oldt); //獲取imageview父控件 View parent=(View) headerView.getParent(); //當(dāng)父控件的top值小于零或者高度大于原始高度時觸發(fā) if(parent.getTop()<0||headerView.getHeight()>headerView_initHeight){ headerView.getLayoutParams().height=headerView.getHeight()+parent.getTop(); parent.layout(parent.getLeft(),0, parent.getRight(), parent.getHeight()); headerView.requestLayout(); } } @Override public boolean onTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub if(ev.getAction()==MotionEvent.ACTION_UP||ev.getAction()==MotionEvent.ACTION_CANCEL){ MyAnimation animation=new MyAnimation(headerView, headerView_initHeight); animation.setDuration(200); headerView.startAnimation(animation); } return super.onTouchEvent(ev); } public class MyAnimation extends Animation{ private ImageView header_iv; private int currentHeight; private int targetHeight; private int poorHeight; public MyAnimation(ImageView iv,int targetHeight){ this.header_iv=iv; this.targetHeight=targetHeight; this.currentHeight=iv.getHeight(); this.poorHeight=this.currentHeight-this.targetHeight; } /** * 動畫執(zhí)行期間執(zhí)行該方法,不斷執(zhí)行 * interpolatedTime:當(dāng)前時間與duration的時間比(時間執(zhí)行百分比) */ @Override protected void applyTransformation(float interpolatedTime, Transformation t) { // TODO Auto-generated method stub super.applyTransformation(interpolatedTime, t); this.header_iv.getLayoutParams().height=(int)(currentHeight-poorHeight*interpolatedTime); this.header_iv.requestLayout(); } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 實(shí)現(xiàn)不依賴焦點(diǎn)和選中的TextView跑馬燈
本文主要介紹Android 跑馬燈的實(shí)現(xiàn),這里提供實(shí)現(xiàn)詳細(xì)實(shí)現(xiàn)代碼供大家參考,有需要的小伙伴可以看下2016-07-07Android 8.0 讀取內(nèi)部和外部存儲以及外置SDcard的方法
今天小編就為大家分享一篇Android 8.0 讀取內(nèi)部和外部存儲以及外置SDcard的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08通過實(shí)例簡單講解Android App中的Activity組件
這篇文章主要介紹了通過Android App中的Activity組件,包括Activity的定義和繼承以及啟動等基本知識,需要的朋友可以參考下2016-04-04Android開發(fā)實(shí)現(xiàn)TextView顯示豐富的文本
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)TextView顯示豐富的文本,涉及Android中TextView的使用技巧,需要的朋友可以參考下2015-12-12TabLayout關(guān)聯(lián)ViewPager后不顯示文字的解決方法
這篇文章主要為大家詳細(xì)介紹了TabLayout關(guān)聯(lián)ViewPager后不顯示文字的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11Android實(shí)現(xiàn)dialog的3D翻轉(zhuǎn)示例
這篇文章主要介紹了Android實(shí)現(xiàn)dialog的3D翻轉(zhuǎn)示例,非常具有實(shí)用價值,需要的朋友可以參考下2017-08-08