Android自定义图文跑马灯效果
时间:2022-07-27
本文章向大家介绍Android自定义图文跑马灯效果,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
之前的需求是用FlipperView来实现上下翻动效果,但是发现数据有点长会造成一屏幕放不下三条数据,后来改为跑马灯,但是只有文字的跑马灯TextView自己就有,但是要求文字后面带一个小图标怎们办呢?
(1).MainActivity.java:
public class HomeFragment extends BaseFragment {
private MarqueeScroll mMarqueeScroll;
private int[] name_tv = {R.id.name_tv1, R.id.name_tv2, R.id.name_tv3, R.id.name_tv4, R.id.name_tv5, R.id.name_tv6};
private TextView[] name_tvs = new TextView[6];
private int[] name_iv = {R.id.name_iv1, R.id.name_iv2, R.id.name_iv3, R.id.name_iv4, R.id.name_iv5, R.id.name_iv6};
private ImageView[] name_ivs = new ImageView[6];
private ArrayList<HomeFlipperBean mFlipperList = new ArrayList<HomeFlipperBean ();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_homenews, null);
mMarqueeScroll = (MarqueeScroll) view.findViewById(R.id.MarqueeScroll);
for (int i = 0; i < name_tv.length; i++) {
name_tvs[i] = (TextView) view.findViewById(name_tv[i]);
name_ivs[i] = (ImageView) view.findViewById(name_iv[i]);
}
mMarqueeScroll.run();
// 在这里进行解析
ResponseBaseBean<ArrayList<HomeFlipperBean responsBaseBean = JSON.parseObject(mFlipperData,
new TypeReference<ResponseBaseBean<ArrayList<HomeFlipperBean () {
});
mFlipperList = responsBaseBean.getResult();
if (mFlipperList != null && mFlipperList.size() 0) {
// ForegroundColorSpan 为文字前景色,BackgroundColorSpan为文字背景色
ForegroundColorSpan span1 = new ForegroundColorSpan(0xFF535353);
ForegroundColorSpan span2 = new ForegroundColorSpan(0xFF346699);
for (int i = 0; i < name_tvs.length; i++) {
HomeFlipperBean bean = mFlipperList.get(i);
name_tvs[i].setText(bean.getName() + " " + bean.getPrice());
if ("up".equals(bean.getTrend())) {
name_ivs[i].setBackgroundResource(R.drawable.in_img3);
} else {
name_ivs[i].setBackgroundResource(R.drawable.in_img4);
}
int length = bean.getName().length();
SpannableStringBuilder builder = new SpannableStringBuilder(name_tvs[i].getText().toString());
builder.setSpan(span1, 0, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(span2, length + 1, name_tvs[i].getText().toString().length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
name_tvs[i].setText(builder);
}
}
}
}
(2).fragment_homenews.xml:布局文件引用控件
<com.monkey.mushroom.ui.view.MarqueeScroll
android:id="@+id/MarqueeScroll"
android:layout_width="match_parent"
android:layout_height="@dimen/kx_nonet_h"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#E1F4FF"
android:orientation="horizontal"
<TextView
android:id="@+id/name_tv1"
style="@style/filpper_text_style" /
<ImageView
android:id="@+id/name_iv1"
style="@style/filpper_image_style" /
<TextView
android:id="@+id/name_tv2"
style="@style/filpper_text_style" /
<ImageView
android:id="@+id/name_iv2"
style="@style/filpper_image_style" /
<TextView
android:id="@+id/name_tv3"
style="@style/filpper_text_style" /
<ImageView
android:id="@+id/name_iv3"
style="@style/filpper_image_style" /
<TextView
android:id="@+id/name_tv4"
style="@style/filpper_text_style" /
<ImageView
android:id="@+id/name_iv4"
style="@style/filpper_image_style" /
<TextView
android:id="@+id/name_tv5"
style="@style/filpper_text_style" /
<ImageView
android:id="@+id/name_iv5"
style="@style/filpper_image_style" /
<TextView
android:id="@+id/name_tv6"
style="@style/filpper_text_style" /
<ImageView
android:id="@+id/name_iv6"
style="@style/filpper_image_style" /
</LinearLayout
</com.jyd.jyddz.ui.view.MarqueeScroll
(3).MarqueeScroll.java:自定义HorizontalScrollView
public class MarqueeScroll extends HorizontalScrollView implements Runnable {
private View inner;
private Bitmap bitmap = null;
/**
* 滚动步长
*/
private int step = 1;
private int x;
private int width;
private int pWidth;
private int pHeight;
public MarqueeScroll(Context context, AttributeSet attrs) {
super(context, attrs);
setBackgroundColor(0xFFE1F4FF);
}
@Override
protected void onFinishInflate() {
if (getChildCount() == 1) {
inner = getChildAt(0);
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
handler.removeCallbacks(this);
}
@Override
protected void onDraw(Canvas canvas) {
if (getWidth() == 0) {
android.view.ViewGroup.LayoutParams lp = getLayoutParams();
lp.width = pWidth;
lp.height = pHeight;
setLayoutParams(lp);
}
if (bitmap == null && inner != null) {
width = inner.getMeasuredWidth();
bitmap = Bitmap.createBitmap(width, inner.getHeight(), Config.RGB_565);
Canvas canvas1 = new Canvas(bitmap);
inner.draw(canvas1);
pWidth = getWidth();
pHeight = getHeight();
if (inner != null) {
removeViewInLayout(inner);
inner = null;
}
run();
}
if (bitmap != null) {
int nowX = x;
nowX -= step;
canvas.drawBitmap(bitmap, nowX, 0, null);
if (nowX < 0) {
canvas.drawBitmap(bitmap, width + nowX /* + space */, 0, null);
}
if (nowX <= -width) {
nowX = 0;
}
x = nowX;
}
super.onDraw(canvas);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
@Override
public void run() {
invalidate();
handler.postDelayed(this, 1);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 十问泛型,你能扛住吗?
- 【两万字】面试官:听说你精通集合源码,接我二十个问题!
- 手把手教你搭建一个技术人的博客
- 发布更新|腾讯云 Serverless 产品动态 20200723
- Spring中异步注解@Async的使用、原理及使用时可能导致的问题
- Elasticsearch 聚合数据结果不精确,怎么破?
- Elasticsearch 预处理没有奇技淫巧,请先用好这一招!
- 时滞微分方程的matlab解法
- Zabbix Monitoring Logstash
- Join()和 List()的 6 种化学反应
- lettuce和hbase中对netty的使用你都了解吗?
- SAS-新规试行下诞生的程序
- AIOHTTP的实战(一)
- JMeter二次开发插件实例
- 「R」Obtain RNAseq Values for a Specific Gene in Xena Database