十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章将为大家详细讲解有关Android中怎么实现一个可拉伸头部控件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
10多年的林周网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整林周建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“林周网站设计”,“林周网站推广”以来,每个客户项目都认真落实执行。
activity-main.xml布局如下:
headerview.xml布局:
list_item布局:
"
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
自定义控件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焦点改变时--获取iamgeview高度的初始值,该值不能在构造方法中获取 */ @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) { // 滑动过头的时候调用 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(); //当父控件的top值小于零或者高度大于原始高度时触发 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; } /** * 动画执行期间执行该方法,不断执行 * interpolatedTime:当前时间与duration的时间比(时间执行百分比) */ @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(); } } }
关于Android中怎么实现一个可拉伸头部控件就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。