用法:
translationView.show();
translationView.hide();
translationView.setShadowColor(ActivityCompat.getColor(MainActivity.this, R.color.blue));//设置背景颜色
源码:
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.support.annotation.ColorInt;
import android.support.v4.view.MotionEventCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
public class TranslationView extends FrameLayout {
private static final String TAG = "TranslationView";
private static final int DEFAULT_COLOR = 0x50000000;
private int mShadowColor = DEFAULT_COLOR;
private boolean mIsShow = false;
private View mTranslationView;
public TranslationView(Context context) {
super(context, null);
}
public TranslationView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
}
public TranslationView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onFinishInflate() {
if (getChildCount() != 2) {
throw new IllegalStateException("only and should contain two child view");
}
mTranslationView = getChildAt(1);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.d(TAG, "onMeasure");
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
mTranslationView.layout(0, -mTranslationView.getHeight(), mTranslationView.getWidth(), 0);
}
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
if (mIsShow && child == mTranslationView) {
canvas.drawColor(mShadowColor);
}
return super.drawChild(canvas, child, drawingTime);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
final int action = MotionEventCompat.getActionMasked(ev);
switch (action){
case MotionEvent.ACTION_DOWN:{
if(mIsShow&&inShadow(ev)){
hide();
return true;
}
}
}
return super.onInterceptTouchEvent(ev);
}
private boolean inShadow(MotionEvent ev) {
float x = ev.getX();
float y = ev.getY();
final float leftEdge = mTranslationView.getX();
final float rightEdge = leftEdge+mTranslationView.getWidth();
final float topEdge =mTranslationView.getHeight();
final float bottomEdge = getHeight()+topEdge;
return x > leftEdge && x < rightEdge && y > topEdge && y < bottomEdge;
}
public void show() {
if (!mIsShow) {
mIsShow = true;
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mTranslationView, "translationY", mTranslationView.getTranslationY(), mTranslationView.getHeight());
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
invalidate();
}
});
objectAnimator.start();
}
}
public void hide() {
if (mIsShow) {
mIsShow = false;
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mTranslationView, "translationY", mTranslationView.getTranslationY(), -mTranslationView.getHeight());
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
invalidate();
}
});
objectAnimator.start();
}
}
public void setShadowColor(@ColorInt int color) {
mShadowColor = color;
}
}
- 大小: 178.8 KB
分享到:
相关推荐
自定义FrameLayout实现手势滑动控制各组件的分层显示
滑动页面里面套滑动广告(ViewPager+FrameLayout)
与Neomorphic Design相关的Android库,它是一个自定义FrameLayout。 基本上,您只需将TextViews和Button放在此FrameLayout中,就可以了! Gradle依赖 将此添加到存储库末尾的root build.gradle文件中: ...
很好用的一款自定义android自定义FrameLayout布局Demo,可延伸到自定义View,有需要的小伙伴可以下载试下!
当滑动时:数值显示,滑动停止时显示数字,使用FrameLayout结合SeekBar。 首先我们看看。 Layout: <?xml version=1.0 encoding=utf-8?> xmlns:tools=http://schemas.android.com/tools> <...
使用FrameLayout帧布局实现tabhost的效果
我是刚刚学习的新手,刚学习完成了用FrameLayout布局完成霓虹灯效果的小程序,与大家分享一下。
自定义控件遇到的两个小问题 自定义控件 自定义属性 描述看博客:http://blog.csdn.net/qeqeqe236/article/details/8919597
可以滑动的界面切换tabhost package com.caigang.test; import android.app.TabActivity; import android.content.Intent; import android.os.Bundle; import android.view.GestureDetector; import android.view....
<FrameLayout android:layout_width=match_parent android:layout_marginLeft=10dp android:layout_marginRight=10dp android:layout_height=wrap_content> <ProgressBar android:id=@+id/pb_process style...
FrameLayout+底部栏切换,实现点击切换界面的效果
通过使用 FrameLayout 实现霓虹灯效果 在改变背景颜色时采用了逐级递增的方式,也就是说当前TextView的背景颜色 是上一次改变背景颜色时比当前TextView尺寸小的相邻的TextView的背景颜色。这样看起来像是某一种颜色...
ForegroundViews - 类似于 FrameLayout 的支持的前景自定义 View
最近对自定义控件充满了兴趣,参考网上的视频写了一个流式布局的例子上传到这,和大家交流学习
android demo,FrameLayout的使用,该实例实现了一个美女在地图上的行走。
ViewPage + RadioGroup + Fragment + FrameLayout搭配解析,RadioGroup 里面有四个RadioButton切换,上面用ViewPage滑动,两边关联,可以相互的切换。也做了用FrameLayout可切换和不可切换的。
侧边导航栏,采用自定义Framelayout实现。
Android自定义View设定到FrameLayout布局中实现多组件显示的方法 分享,需要的朋友可以参考一下
19Android-04-frameLayout.mp4