GVKun编程网logo

android – 在TextView中动态加载AnimationDrawable(android动态添加textview)

6

针对android–在TextView中动态加载AnimationDrawable和android动态添加textview这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展AndroidAni

针对android – 在TextView中动态加载AnimationDrawableandroid动态添加textview这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Android AnimationDrawable动画与APP启动引导页面、Android AnimationDrawable缩放、Android DrawableTextView图片文字居中显示实例、android glide 设置 textview drawable 重写大小等相关知识,希望可以帮助到你。

本文目录一览:

android – 在TextView中动态加载AnimationDrawable(android动态添加textview)

android – 在TextView中动态加载AnimationDrawable(android动态添加textview)

我需要替换带有图像的文本短语,然后将其附加到TextView.对于常规Drawables,这没有问题,但是当Drawable是一个AnimationDrawable时,我不知道在何时何地调用.start();.

这是我将文本追加到TextView的方法:

textview.append(Html.fromHtml(textWithHtmlImgTags,imagegetter,null));

使用imagegetter替换textWithHtmlImgTags中的图像标记:

new ImageGetter()
{
    @Override
    public Drawable getDrawable(String source) {

        if(source.endsWith("_ani"))
        {
            Log.i("cmv","This is an animated drawable.");

            AnimationDrawable dra = (AnimationDrawable)res.getDrawable(sRes.get(source));
            dra.setBounds(0,dra.getIntrinsicWidth(),dra.getIntrinsicHeight());
            dra.start(); // This doesn't work..

            return dra;
        }

        Drawable dr = res.getDrawable(sRes.get(source));
        dr.setBounds(0,dr.getIntrinsicWidth(),dr.getIntrinsicHeight());
        return dr;
    }

};

添加了我的AnimationDrawables,但它们没有动画(它们被卡在第1帧上).

在文档中它说:

It’s important to note that the start() method called on the AnimationDrawable cannot be called during the onCreate() method of your Activity,because the AnimationDrawable is not yet fully attached to the window. If you want to play the animation immediately,without requiring interaction,then you might want to call it from the onWindowFocusChanged() method in your Activity,which will get called when Android brings your window into focus.

由于图像是动态添加的,我认为它与onCreate()没有任何关系.
所以当我的drawable尚未完全附加到窗口时,我想我会调用我的.start(),但是我/何时/应该如何调用它?

提前致谢!

解决方法

我出来了解决方案.
在自定义TextView中:

(1)首先,你必须决定动画开始和结束的时间.

@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();

    handleAnimationDrawable(true);
}

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();

    handleAnimationDrawable(false);
}

private void handleAnimationDrawable(boolean isPlay) {
    CharSequence text = getText();
    if (text instanceof Spanned) {
        Spanned span = (Spanned) text;
        ImageSpan[] spans = span.getSpans(0,span.length() - 1,ImageSpan.class);
        for (ImageSpan s : spans) {
            Drawable d = s.getDrawable();
            if (d instanceof AnimationDrawable) {
                AnimationDrawable animationDrawable = (AnimationDrawable) d;
                if (isPlay) {
                    animationDrawable.setCallback(this);
                    animationDrawable.start();
                } else {
                    animationDrawable.stop();
                    animationDrawable.setCallback(null);
                }
            }
        }
    }
}

(2)然后实现自己的Drawable.Callback来触发重绘.

@Override
public void invalidateDrawable(Drawable dr) {
    invalidate();
}

@Override
public void scheduleDrawable(Drawable who,Runnable what,long when) {
    if (who != null && what != null) {
        mHandler.postAtTime(what,when);
    }
}

@Override
public void unscheduleDrawable(Drawable who,Runnable what) {
    if (who != null && what != null) {
        mHandler.removeCallbacks(what);
    }
}

Android AnimationDrawable动画与APP启动引导页面

Android AnimationDrawable动画与APP启动引导页面

Android AnimationDrawable动画与APP启动、加载引导页面(画面)

AnimationDrawable是Android的Frame动画,可以简单的认为此AnimationDrawable能够将一系列资源图片加载成“电影”一样播放。当下,在一些APP中,往往需要在APP切入主题之前加载一些引导页面(宣传海报、装饰画面、赞助商广告等等),这些内容要两个共同特点:
(1)不是APP的重点内容,而仅仅只是像展台一样展览一些画面。
(2)前、当前、后页面基本上无特别需要处理的交互设计(因为只是播放几张或几帧画面而已),然后就跳转进入APP实质内容。
现在就给出一个示例小demo,实现一个简单的样例:一个APP的MainActivity启动后,循环播放3张图片。

(第1步)先在res/drawable目录下事先放置好需要播放的图片资源。如图:


(第2步)在res/anim目录下建立animation-list的xml代码文件,假设这个代码文件就叫做my_animation.xml,如图,


该文件的具体代码内容:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:drawable="@drawable/p1"
        android:duration="2000"/>
    
    <item
        android:drawable="@drawable/p2"
        android:duration="2000"/>
    
    <item
        android:drawable="@drawable/p3"
        android:duration="2000"/>

</animation-list>


Item的资源图片p1,p2,p3将顺序播放。android:duration的值(毫秒)是该item播放持续的时间,在这个例子中,就是将图片显示一段时间。


(第3步)在Activity加载的布局文件activity_main.xml里面写一个ImageView,设置该ImageView的android:src= 第2步创建好的my_animation.xml。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <Button
        android:id="@+id/play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/play" />
    
    <Button
        android:id="@+id/stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/stop" />
    
     <ImageView
        android:id="@+id/imegaView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@anim/my_animation" />
    
</LinearLayout>

到这里,就完成了设计目的,这个Activity启动后,就会在ImageView里面自带播放动画,当然,可以做的更多,为这个动画添加一些控制按钮(play,stop),控制播放(play)或者停止(stop)。

测试的activity:MainActivity.java:

package zhangphil.animation;

import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;

public class MainActivity extends ActionBarActivity {

	private	AnimationDrawable mAnimationDrawable=null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		ImageView imageView=(ImageView)findViewById(R.id.imegaView);
		mAnimationDrawable=(AnimationDrawable) imageView.getDrawable();
	
		Button play=(Button)findViewById(R.id.play);
		play.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				mAnimationDrawable.start();
			}
		});
		
		Button stop=(Button)findViewById(R.id.stop);
		stop.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				mAnimationDrawable.stop();
			}
		});
	}
}


Android AnimationDrawable缩放

Android AnimationDrawable缩放

我有一个最初有Bitmap Image的ImageView:

    <ImageView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    /> 

默认情况下,imageview缩放位图以填充我想要的宽度.

但问题是,当我将ImageView的源代码更改为AnimationDrawable时,即由原始尺寸相同的几个图像构建,然后动画根本不会缩放并返回到原始图像.

我怎样才能以与缩放位图相同的方式缩放动画drawable?

解决方法:

我通过使用ImageView setPadding()以编程方式处理此问题.我计算了ImageView高度和宽度之间的差异以及我想要显示的内容并设置了我自己的填充,以便ImageView的可用大小与我的动画完全匹配.

这是蛮力而且不是很灵活,但我没有看到任何更好的解决方案,这个问题已经出现过很多次了.

Android DrawableTextView图片文字居中显示实例

Android DrawableTextView图片文字居中显示实例

 在我们开发中,TextView设置Android:drawableLeft一定使用的非常多,但Drawable和Text同时居中显示可能不好控制,有没有好的办法解决呢?

小编的方案是通过自定义TextView实现。

实现的效果图:

这里写图片描述

注:第一行为原生TextView添加android:drawableLeft

第二行为自定义TextView实现的效果。

实现思路:

继承TextView,覆盖onDraw(Canvas canvas),在onDraw中先将canvas进行translate平移,再调用父类onDraw进行绘制。

DrawableTextView.Java:
package com.xing.drawabletextview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.TextView;
/**
 * Created by Administrator on 2017/2/28.
 */
public class DrawableTextView extends TextView {
  public DrawableTextView(Context context) {
    this(context,null);
  }
  public DrawableTextView(Context context,AttributeSet attrs) {
    this(context,attrs,0);
  }
  public DrawableTextView(Context context,AttributeSet attrs,int defStyleAttr) {
    super(context,defStyleAttr);
  }
  @Override
  protected void onDraw(Canvas canvas) {
    // getCompoundDrawables() : Returns drawables for the left,top,right,and bottom borders.
    Drawable[] drawables = getCompoundDrawables();
    // 得到drawableLeft设置的drawable对象
    Drawable leftDrawable = drawables[0];
    if (leftDrawable != null) {
      // 得到leftDrawable的宽度
      int leftDrawableWidth = leftDrawable.getIntrinsicWidth();
      // 得到drawable与text之间的间距
      int drawablePadding = getCompoundDrawablePadding();
      // 得到文本的宽度
      int textWidth = (int) getPaint().measureText(getText().toString().trim());
      int bodyWidth = leftDrawableWidth + drawablePadding + textWidth;
      canvas.save();
      canvas.translate((getWidth() - bodyWidth) / 2,0);
    }
    super.onDraw(canvas);
  }
}

布局文件中引入:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:orientation="horizontal">
    <com.xing.drawabletextview.DrawableTextView
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:drawableLeft="@drawable/ic_one"
      android:drawablePadding="10dp"
      android:gravity="center_vertical"
      android:text="21" />
    <com.xing.drawabletextview.DrawableTextView
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:drawableLeft="@drawable/ic_two"
      android:drawablePadding="10dp"
      android:gravity="center_vertical"
      android:text="99" />
    <com.xing.drawabletextview.DrawableTextView
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:drawableLeft="@drawable/ic_three"
      android:drawablePadding="10dp"
      android:gravity="center_vertical"
      android:text="99+" />
  </LinearLayout>

以上所述是小编给大家介绍的Android DrawableTextView图片文字居中显示实例,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

android glide 设置 textview drawable 重写大小

android glide 设置 textview drawable 重写大小

int imageWidth=px2dip(context,65);

RoundedCorners roundedCorners= new RoundedCorners(50);
Glide.with(context)
.load(item.getAvatar()).apply(new RequestOptions().bitmapTransform(roundedCorners).diskCacheStrategy(diskCacheStrategy.DATA).override(imageWidth,imageWidth)).into(new ViewTarget<TextView, Drawable>(tv) {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
view.setCompoundDrawablesWithIntrinsicBounds(null,resource,null,null);
}
});

关于android – 在TextView中动态加载AnimationDrawableandroid动态添加textview的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android AnimationDrawable动画与APP启动引导页面、Android AnimationDrawable缩放、Android DrawableTextView图片文字居中显示实例、android glide 设置 textview drawable 重写大小的相关知识,请在本站寻找。

本文标签: