1

我正在使用以下代码来设置 ImageView 的 alpha 值(这应该与所有设备兼容,甚至是 API 11 之前的设备)

AlphaAnimation alpha = new AlphaAnimation(0.85F, 0.85F);
alpha.setDuration(0); // Make animation instant
alpha.setFillAfter(true); // Tell it to persist after the animation ends
ImageView view = (ImageView) findViewById(R.id.transparentBackground);
view.startAnimation(alpha);

但是,当我在运行姜饼及以下的设备上打开应用程序时,imageView 是完全透明的,但在蜂窝或更高版本上运行的设备上,alpha 值设置为 .85,并且 imageView 完美显示。

如何在gingerBread 上也能做到这一点?

4

3 回答 3

2

实现此功能的一种简单方法是使用 NineOldAndroids 项目,该项目将 Honeycomb 动画 API 移植回包括 AlphaAnimation 在内的旧版本。请参阅http://nineoldandroids.com/

因此,使用 ObjectAnimator 将是这样的:

ObjectAnimator.ofFloat(imageView, "alpha", .85f).start();
于 2013-02-27T05:07:32.933 回答
0

好的,让我们创建一个自定义图像视图,它通过覆盖 onDraw 解决了这个问题 :)

AlphaImageView.java

package com.example.shareintent;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.ImageView;

public class AlphaImageView extends ImageView {

    public AlphaImageView(Context context) {
        super(context);
    }

    public AlphaImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AlphaImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onDraw(Canvas canvas){
        canvas.saveLayerAlpha(0, 0, canvas.getWidth(), canvas.getHeight(), 0x66, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);
        super.onDraw(canvas);
    }

}

你的活动 xml

<com.example.shareintent.AlphaImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="52dp"
        android:layout_marginTop="50dp"
        android:src="@drawable/ic_launcher" />
于 2012-11-22T10:15:30.293 回答
0

你有一个函数来做(由于新视图处理透明度的通用方式已被弃用,但可以在 Android 2.x 上安全使用):

myImageView.setAlpha(128); // range [0, 255]

不过,您必须实现自定义动画。这可以通过处理程序来完成,例如:

Handler animationHandler = new Handler() {
   public void handleMessage(Message msg) {
       int currentAlpha = msg.arg1;
       int targetAlpha = msg.arg2;

       if (currentAlpha==targetAlpha) return;
       else {
           if (currentAlpha<targetAlpha) --currentAlpha;
           else ++currentAlpha;

           imageView.setAlpha(currentAlpha);

           sendMessageDelayed(obtainMessage(0, currentAlpha, targetAlpha), 10);
       }
   }
}


// Show imageview
animationHandler.sendMessage(animationHandler.obtainMessage(0, currentAlpha, 255));

// Hide imageview
animationHandler.sendMessage(animationHandler.obtainMessage(0, currentAlpha, 0));
  • 上面的代码不是内存泄漏安全的(处理程序应该是静态的,并且应该保持对上下文和视图的弱引用
  • 您应该改进它以允许控制动画速度,...
  • 您需要保留当前的 ​​alpha,因为 imageView 没有 getAlpha 方法。
于 2012-11-22T10:13:18.510 回答