package com.tv.ui.metro.view;
import android.content.Context;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.tv.ui.metro.R;
import com.tv.ui.metro.loader.ProgressNotifiable;
public class EmptyLoadingView extends LinearLayout implements ProgressNotifiable {
private LinearLayout mProgressLayout;
private ImageView mProgressView;
private LinearLayout mEmptyView;
private TextView mTextView;
private View mDataLoadingView;
private Animation mRotateAnim;
public EmptyLoadingView(Context context) {
super(context);
init(context);
}
@SuppressWarnings("deprecation")
private void init(Context context) {
LayoutInflater.from(context).inflate(R.layout.empty_loading_layout, this);
mProgressLayout = (LinearLayout) this.findViewById(R.id.progress_layout);
mProgressView = (ImageView) this.findViewById(R.id.empty_progress_view);
mEmptyView = (LinearLayout) this.findViewById(R.id.empty_layout);
if(Build.VERSION.SDK_INT >= 16){
mEmptyView.setBackground(null);
}else {
mEmptyView.setBackgroundDrawable(null);
}
mTextView = (TextView) this.findViewById(R.id.empty_textview);
mTextView.getPaint().setFakeBoldText(true);
}
public void setDataLoadingView(View dataLoadingView) {
mDataLoadingView = dataLoadingView;
}
@SuppressWarnings("deprecation")
private void updateStyle(boolean hasData) {
if (mDataLoadingView == null) {
if (hasData) {
getLayoutParams().height = LayoutParams.WRAP_CONTENT;
//setBackgroundResource(R.drawable.loading_view_bg);//放在最后一项时有用
// TODO
} else {
getLayoutParams().height = LayoutParams.MATCH_PARENT;
if(Build.VERSION.SDK_INT >= 16){
setBackground(null);
}else {
setBackgroundDrawable(null);
}
}
}
}
@Override
public void startLoading(boolean hasData) {
updateStyle(hasData);
mProgressLayout.setVisibility(VISIBLE);
mEmptyView.setVisibility(GONE);
if (mDataLoadingView != null && hasData) {
showView(mDataLoadingView);
hideView(this);
} else {
showView(this);
hideView(mDataLoadingView);
}
}
@Override
public void stopLoading(boolean hasData, boolean hasNext) {
if (!hasNext) {
updateStyle(hasData);
hideView(mDataLoadingView);
if (hasData) {
hideView(this);
} else {
showView(this);
mProgressLayout.setVisibility(GONE);
viewStopANimation(mProgressView);
mEmptyView.setVisibility(VISIBLE);
}
}
}
private void showView(View view) {
if (view == null) {
return;
}
if (view.getVisibility() == GONE) {
view.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.appear));
view.setVisibility(VISIBLE);
}
if (null == mRotateAnim) {
viewStartAnimation(mProgressView);
}
}
private void hideView(View view) {
if (view == null) {
return;
}
if (view.getVisibility() == VISIBLE) {
if (view.isShown()) {
view.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.disappear));
}
view.setVisibility(GONE);
}
if (mRotateAnim != null) {
viewStopANimation(mProgressView);
}
}
@Override
public void init(boolean hasData, boolean isLoading) {
updateStyle(hasData);
if (isLoading) {
if (mDataLoadingView != null && hasData) {
setVisibility(GONE);
mDataLoadingView.setVisibility(VISIBLE);
} else {
setVisibility(VISIBLE);
mProgressLayout.setVisibility(VISIBLE);
viewStartAnimation(mProgressView);
mEmptyView.setVisibility(GONE);
}
} else {
if (mDataLoadingView != null) {
mDataLoadingView.setVisibility(GONE);
}
if (hasData) {
setVisibility(GONE);
} else {
setVisibility(VISIBLE);
mProgressLayout.setVisibility(GONE);
viewStopANimation(mProgressView);
mEmptyView.setVisibility(VISIBLE);
}
}
}
public void setEmptyText(int emptyRes) {
mTextView.setText(emptyRes);
}
public void setEmptyText(CharSequence text) {
mTextView.setText(text);
}
public void viewStartAnimation(ImageView view) {
mProgressLayout.setVisibility(View.VISIBLE);
mRotateAnim = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
mRotateAnim.setInterpolator(new LinearInterpolator());
mRotateAnim.setRepeatCount(Animation.INFINITE);
mRotateAnim.setDuration(800);
// mRotateAnim.setFillAfter(false);
view.startAnimation(mRotateAnim);
}
public void viewStopANimation(ImageView view) {
if (mRotateAnim != null) {
view.clearAnimation();
mRotateAnim = null;
mProgressLayout.setVisibility(View.GONE);
}
}
}