自定义控件之视差效果

/**
* 视差特效实现思路:模仿QQ回弹界面
* 1.解析OnTouche,Action_Dowm,Action_move,Activity_up,业务逻辑
* 2.重写Listview的ouverScrollBy方法,继承式自定义控件ListView,根据用户下拉距离,动态修改headerview的高度
* a.拷贝文本资源到项目,自定义控件机场ListView
* b.使用自定义控件,并往头部添加布局,设置适配器
* c.使用视图树,吧ImageView传给我们的自定义控件
*/
public class MainActivity extends AppCompatActivity {
private ParallaxListView plv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//a.View调用id
plv=(ParallaxListView) findViewById(R.id.par);
//ListView添加一个头布局,ListView的上拉刷新,下拉加载
View headerView=View.inflate(this, R.layout.layout_header,null);
plv.addHeaderView(headerView);
final ImageView iv_header=(ImageView) headerView.findViewById(R.id.iv_header);
//等View界面全部绘制完毕的时候,去得到已经绘制完控件的宽和高,查一下这个方法,并做一个记
iv_header.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//宽和高已经测量完毕
plv.setparallaxImage(iv_header);
//释放资源
iv_header.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
//b.使用ListView的ArrayAdapter,添加文本item
plv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,Cheeses.NAMES));
}
}
/**
* Created by 小亚 on 2017/8/16.
* function:继承式控件
* 1.继承ListView,覆写构造方法
* 2.覆写overScrollBy方法,重点关注deltay,isTouchEvent方法
* 3.暴露一个方法,去得到外界ImageView,兵测量ImageView控件高度
* 4.覆写OnToucheEvent方法
*/
public class ParallaxListView extends ListView {
private ImageView iv_header;
private int drawadleHeight;
private int mOriginalHeight;
public ParallaxListView(Context context) {
this(context, null);
}
public ParallaxListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ParallaxListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setparallaxImage(ImageView iv_header) {
this.iv_header = iv_header;
//c.获取imageview控件原始高度,要回弹的高度
mOriginalHeight = iv_header.getHeight();
//获取图片原始高度
drawadleHeight = iv_header.getDrawable().getIntrinsicHeight();
}
/**
* a.滑动到ListView两端时调用
* @param deltaX:竖直方向滑动到瞬时变化量,顶部下拉为负
* @param deltaY $$$
* @param scrollX
* @param scrollY
* @param scrollRangeX
* @param scrollRangeY
* @param maxOverScrollX
* @param maxOverScrollY
* @param isTouchEvent $$$ 是否是用户触摸拉动,true表示用户手指拉动,false为惯性
* @return
*/
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,
int scrollY, int scrollRangeX,
int scrollRangeY, int maxOverScrollX,
int maxOverScrollY, boolean isTouchEvent) {
//顶部下拉,用户触摸的操作才执行视差效果(&和&&,|和||)
if (deltaY < 0 && isTouchEvent) {
//deltaY是负值,我们要改为绝对值累计给我们iv_header高度
int newHeight = iv_header.getHeight() + Math.abs(deltaY);
//避免图片的无线放大,使图片不能够超过图片本身
//把拉动的瞬时变化量的绝对值交给Header,就可以实现放大的效果了
if (newHeight <= drawadleHeight)
iv_header.getLayoutParams().height = newHeight;
iv_header.requestLayout();
}
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
}
//c.覆写触摸事件,让滑动图片重新恢复原样
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
//把当前的头布局高度恢复初始高度
//执行回弹动画,方式一:属性动画
//从当前高度mImage.getHeight(),执行动画到原始高度mOriginalHeight
final int startHeight = iv_header.getHeight();
final int endHeight = mOriginalHeight;
//ValueAnimator(startHeight,endHeight);
//执行回弹动画,方式二:自定义Animation
//属性动画,改变高度值,把当前头布局高度,改为原始高度
final ValueAnimator animator=ValueAnimator.ofInt(startHeight,mOriginalHeight);
//动画更新监听
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float fraction=animator.getAnimatedFraction();
//获取中间值,付给控件新高度,是控件平稳会谈
Integer animatedValue = (Integer) animator.getAnimatedValue();
iv_header.getLayoutParams().height=animatedValue;
iv_header.requestLayout();
}
});
//动画回弹效果,值越大,回弹越厉害
animator.setInterpolator(new OvershootInterpolator(3));
//设置动画执行时间
animator.setDuration(300);
animator.start();
default:
break;
}
return super.onTouchEvent(ev);
}
}
/**
* Created by 小亚 on 2017/8/15.
*/
public class Cheeses {
public static final String[] NAMES = new String[]{"宋江", "卢俊义", "吴用",
"公孙胜", "关胜", "林冲", "秦明", "呼延灼", "花荣", "柴进", "李应", "朱仝", "鲁智深",
"武松", "董平", "张清", "杨志", "徐宁", "索超", "戴宗", "刘唐", "李逵", "史进", "穆弘",
"雷横", "李俊", "阮小二", "张横", "阮小五", " 张顺", "阮小七", "杨雄", "石秀", "解珍",
" 解宝", "燕青", "朱武", "黄信", "孙立", "宣赞", "郝思文", "韩滔", "彭玘", "单廷珪",
"魏定国", "萧让", "裴宣", "欧鹏", "邓飞", " 燕顺", "杨林", "凌振", "蒋敬", "吕方",
"郭 盛", "安道全", "皇甫端", "王英", "扈三娘", "鲍旭", "樊瑞", "孔明", "孔亮", "项充",
"李衮", "金大坚", "马麟", "童威", "童猛", "孟康", "侯健", "陈达", "杨春", "郑天寿",
"陶宗旺", "宋清", "乐和", "龚旺", "丁得孙", "穆春", "曹正", "宋万", "杜迁", "薛永", "施恩",
"周通", "李忠", "杜兴", "汤隆", "邹渊", "邹润", "朱富", "朱贵", "蔡福", "蔡庆", "李立",
"李云", "焦挺", "石勇", "孙新", "顾大嫂", "张青", "孙二娘", " 王定六", "郁保四", "白胜",
"时迁", "段景柱", "易宸锋","郭嘉","吕布","袁绍","孙策","甘宁","吕蒙"};

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值