广告滚动

package com.wqy.mydemo;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Looper;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.EditText;
import android.widget.FrameLayout;

import java.util.ArrayList;
import java.util.List;

/**

  • Created by Administrator on 2019/10/14 0014.
    */

public class SearchView extends FrameLayout implements View.OnClickListener {

private final long DEFAULT_ANIMATION_DURATION = 1000; // 动画时长
private final long DEFAULT_SEARCH_SPACE = 3000; // 搜索切换时长

private long mSearchDuration = DEFAULT_SEARCH_SPACE;
private int mTextColor;
private float mTextSize;

private String targetContent;
private List<EditText> mSearchList;
private int mCurrentSearch;
private AnimationSet mEnterAnimSet;
private AnimationSet mExitAnimSet;
private Handler mHandler = new Handler(Looper.getMainLooper());
private SearchRunnable mSearchRunnable;
private OnItemClickListener mListener;
private TextPaint textPaint;
private boolean mIsRunning; // 是否正已经start()

public SearchView(Context context) {
    this(context, null);
}

public SearchView(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.SearchView);
    mTextColor = array.getColor(R.styleable.SearchView_textColor, 0xff000000);
    mTextSize = array.getDimension(R.styleable.SearchView_textSize, 15);
    array.recycle();

    // 初始化动画
    createExitAnimation();
    createEnterAnimation();

    // 初始化一个画笔,用于测量高度
    textPaint = new TextPaint();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    // 如果是未指定大小,那么设置宽为300px
    int exceptWidth = 300;
    int exceptHeight = 0;

    // 计算高度,如果将高度设置为textSize会很丑,因为文字有默认的上下边距
    if (MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY) {
        if (mTextSize > 0) {
            textPaint.setTextSize(mTextSize);
            Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
            exceptHeight = (int) (fontMetrics.bottom - fontMetrics.top);
        }
    }

    int width = resolveSize(exceptWidth, widthMeasureSpec);
    int height = resolveSize(exceptHeight, heightMeasureSpec);
    setMeasuredDimension(width, height);
}

private void createEnterAnimation() {
    mEnterAnimSet = new AnimationSet(false);
    TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 0,
            TranslateAnimation.RELATIVE_TO_PARENT, 1f, TranslateAnimation.RELATIVE_TO_SELF, 0f);
    AlphaAnimation alphaAnimation = new AlphaAnimation(0f, 1f);
    mEnterAnimSet.addAnimation(translateAnimation);
    mEnterAnimSet.addAnimation(alphaAnimation);
    mEnterAnimSet.setDuration(DEFAULT_ANIMATION_DURATION);
}

private void createExitAnimation() {
    mExitAnimSet = new AnimationSet(false);
    TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 0,
            TranslateAnimation.RELATIVE_TO_SELF, 0f, TranslateAnimation.RELATIVE_TO_PARENT, -1f);
    AlphaAnimation alphaAnimation = new AlphaAnimation(1f, 0f);
    mExitAnimSet.addAnimation(translateAnimation);
    mExitAnimSet.addAnimation(alphaAnimation);
    mExitAnimSet.setDuration(DEFAULT_ANIMATION_DURATION);
}

/**
 * 当和目标内容相等时则暂停动画
 *
 * @param content 目标内容
 */
public void setTargetContent(String content) {
    this.targetContent = content;
}

/**
 * 设置搜索的集合
 */
public void setSearchList(List<String> list) {
    // 设置集合的时候,要将上一次的集合清除
    if (list == null || list.size() == 0) {
        return;
    }

    // 暂停轮播
    pause();

    // 移除所有搜索
    removeAllViews();
    if (mSearchList == null) {
        mSearchList = new ArrayList<>();
    }
    mSearchList.clear();

    // 创建EditText
    for (int i = 0; i < list.size(); i++) {
        EditText textView = createTextView(list.get(i));
        mSearchList.add(textView);
        addView(textView);
    }
    // 显示第一条搜索
    mCurrentSearch = 0;
    mSearchList.get(mCurrentSearch).setVisibility(VISIBLE);
    // 启动轮播
    start();
}

/**
 * 设置条目点击监听
 */
public void setOnItemClickListener(OnItemClickListener listener) {
    setOnClickListener(this);
    mListener = listener;
}

/**
 * 设置搜索的切换间隔
 */
public void setSearchDuration(long duration) {
    if (duration > 0) {
        mSearchDuration = duration;
    }
}

/**
 * 设置动画的时长
 */
public void setAnimationDuration(long duration) {
    if (duration > 0) {
        if (mEnterAnimSet != null) {
            mEnterAnimSet.setDuration(duration);
        }
        if (mExitAnimSet != null) {
            mExitAnimSet.setDuration(duration);
        }
    }
}

/**
 * 设置搜索的进入动画
 */
public void setEnterAnimation(AnimationSet animation) {
    mEnterAnimSet = animation;
}

/**
 * 设置搜索的退出动画
 */
public void setExitAnimation(AnimationSet animation) {
    mExitAnimSet = animation;
}

/**
 * 开始循环播放搜索
 * 推荐和pause()配合在生命周期中使用
 */
public void start() {
    // 如果轮播正在运行中,不重复执行
    if (mIsRunning) {
        return;
    }

    if (mSearchRunnable == null) {
        mSearchRunnable = new SearchRunnable();
    } else {
        mHandler.removeCallbacks(mSearchRunnable);
    }
    mHandler.postDelayed(mSearchRunnable, mSearchDuration);
    mIsRunning = true;
}

/**
 * 暂停循环播放搜索
 * 推荐和start()配合在生命周期中使用
 */
public void pause() {
    // 如果轮播已经停止,不重复执行
    if (!mIsRunning) {
        return;
    }

    if (mSearchRunnable != null) {
        mHandler.removeCallbacks(mSearchRunnable);
    }

    mIsRunning = false;
}

/**
 * 当前是否正在轮播内容
 */
public boolean isRunning() {
    return mIsRunning;
}

private EditText createTextView(String text) {
    View view = LayoutInflater.from(getContext()).inflate(R.layout.view_search, this, false);
    EditText editInput = view.findViewById(R.id.edit_input);
    editInput.setSingleLine();
    editInput.setEllipsize(TextUtils.TruncateAt.END);
    editInput.setTextColor(mTextColor);
    editInput.setVisibility(GONE);
    editInput.setText(text);
    if (mTextSize > 0) {
        editInput.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
    }
    return editInput;
}

/**
 * 获取当前显示View的内容
 */
public String getCurrentSearchText() {
    if (mSearchList != null) {
        return mSearchList.get(mCurrentSearch).getText().toString();
    }
    return "";
}

/**
 * 动画开始的一瞬间就代表这个内容已经退出,下一个内容开始进入,点击事件也是给了下一个内容
 */
class SearchRunnable implements Runnable {
    @Override
    public void run() {
        // 隐藏当前的EditText
        EditText currentView = mSearchList.get(mCurrentSearch);
        currentView.setVisibility(GONE);
        if (mExitAnimSet != null) {
            currentView.startAnimation(mExitAnimSet);
        }
        mCurrentSearch++;
        if (mCurrentSearch >= mSearchList.size()) {
            mCurrentSearch = 0;
        }

        // 显示下一个EditText
        EditText nextView = mSearchList.get(mCurrentSearch);
        nextView.setVisibility(VISIBLE);
        if (mEnterAnimSet != null) {
            nextView.startAnimation(mEnterAnimSet);
        }
        mHandler.postDelayed(this, mSearchDuration);

        // 若当前显示内容为目标内容则暂停
        if (nextView.getText().toString().equals(targetContent)) {
            pause();
        }
    }
}

@Override
public void onClick(View v) {
    if (mListener != null && mSearchList != null && mSearchList.size() > 0) {
        mListener.onItemClick(mSearchList.get(mCurrentSearch), mCurrentSearch);
    }
}

/**
 * 点击的回调
 */
public interface OnItemClickListener {
    void onItemClick(EditText view, int position);
}

}

view_search 布局

<?xml version="1.0" encoding="utf-8"?>

attrs.xml

MainActivity.class

package com.wqy.mydemo;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONStringer;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class JsonActivity extends AppCompatActivity implements View.OnClickListener {

private TextView tv_banner;
private TextView tv_json;
private Button btn_fresh;
private Button btn_show;
private ArrayList<String> mWords;
private String mJson;
private EditText chats_view;
private MarqueeTextView marqueeTv;
private String[] textArrays = new String[]{"this is content No.1", "this is content No.2", "this is content No.3"};
private String[] textArrays1 = new String[]{"this is content No.1"};

private SearchView searchView;
private Button btnStart;
private Button btnShow;
private List<String> list = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_json);

    searchView = findViewById(R.id.search_view);
    btnStart = findViewById(R.id.btn_start);
    btnShow = findViewById(R.id.btn_show);
    btnShow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btnShow.setText("当前内容- " + searchView.getCurrentSearchText());
        }
    });
    btnStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            list.clear();
            list.add("推荐歌曲");
            list.add("挺好听的");
            searchView.setSearchList(list);
        }
    });

    list.clear();
    list.add("推荐歌曲");
    list.add("挺好听的");
    searchView.setSearchList(list);
    searchView.setTargetContent("挺好听的");
    // 默认动画效果就是渐变和位移,可以通过这个设置动画的时长,默认是1000
    searchView.setAnimationDuration(1000);
    // 设置搜索的切换间隔,时间比动画的时长长就好,默认是3000
    searchView.setSearchDuration(1000);
    searchView.setOnItemClickListener(new SearchView.OnItemClickListener() {
        @Override
        public void onItemClick(EditText view, int position) {
            String s = list.get(position);
            view.setTextColor(Color.GRAY);
            Toast.makeText(JsonActivity.this, s, Toast.LENGTH_SHORT).show();
        }
    });
}

@Override
protected void onResume() {
    super.onResume();
    searchView.start();
}

@Override
protected void onPause() {
    super.onPause();
    searchView.pause();
}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值