Ответ 1
Я предпочел бы сделать это наоборот: поставьте темный прямоугольник за представление и задайте непрозрачность представления. Это сохраняет рисование прямоугольника, когда представление на 100% непрозрачно.
Я нашел, как изменить непрозрачность View
, но мне нужно фактически затемнить View
. Моя лучшая идея - поместить на него прозрачный черный прямоугольник, а затем медленно увеличить непрозрачность прямоугольника.
Знаете ли вы более хороший способ сделать это?
public class Page07AnimationView extends ParentPageAnimationView {
private final String TAG = this.getClass().getSimpleName();
private ImageView overlay;
private int mAlpha = 0;
public Page07AnimationView(Context context) {
super(context);
}
public Page07AnimationView(Context context, AttributeSet attrs) {
super(context, attrs);
}
protected void init()
{
overlay = new ImageView(mContext);
overlay.setImageResource(R.drawable.black_background);
overlay.setAlpha(0);
overlay.setWillNotDraw(false);
// make the PageAniSurfaceView focusable so it can handle events
setFocusable(true);
}
protected void draw_bitmaps(Canvas canvas)
{
overlay.draw(canvas);
update_bitmaps();
invalidate();
}
public void update_bitmaps()
{
if(mAlpha < 250)
{
mAlpha += 10;
overlay.setAlpha(mAlpha);
}
}
}
Этот код не делает то, что я надеялся. Page07AnimationView
добавляется к FrameLayout
по представлению, которое мне нужно затемнить. R.drawable.black_background
указывает на черно-белое изображение размером 787px x 492px.
Я добавил overlay.setWillNotDraw(false);
, но это не помогло.
Я изменил первый setAlpha(0)
на setAlpha(255)
, но это не помогло.
Я вообще удалил вызовы setAlpha()
, но это не помогло.
Эта базовая методика добавления PageNNAnimationView
работает над рисованием Bitmaps
, но не для рисования ImageView overlay
. (Я бы использовал Bitmaps
, но у них, похоже, нет альфа-компонента.)
Edit2: это родительский класс выше:
public class ParentPageAnimationView extends View {
private final String TAG = this.getClass().getSimpleName();
protected Context mContext;
public ParentPageAnimationView(Context context) {
super(context);
mContext = context;
init();
}
public ParentPageAnimationView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
}
protected void init()
{
}
protected void draw_bitmaps(Canvas canvas)
{
// will be overridden by child classes
}
@Override
protected void onDraw(Canvas canvas) {
if(this.getVisibility() == View.VISIBLE)
{
if(canvas != null)
{
draw_bitmaps(canvas);
}
}
}
public void update_bitmaps()
{
// will be overridden by child classes
}
public void elementStarted(PageElement _pageElement) {
// Nothing in parent class
}
public void elementFinished(PageElement mElement) {
// Nothing in parent class
}
}
Я предпочел бы сделать это наоборот: поставьте темный прямоугольник за представление и задайте непрозрачность представления. Это сохраняет рисование прямоугольника, когда представление на 100% непрозрачно.
В случае ImageView, вот один из способов его достижения:
imageView.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY);
Я бы сделал что-то вроде этого:
view.getBackground().setColorFilter(color, PorterDuff.Mode.DARKEN);
Используйте черный цвет с некоторой альфой, например 0x7f000000
для типичного затемнения.
Это более сжато, и вы можете также затемнить View
с помощью анимации или прокрутки. Просто установите Color.argb(alpha, 0, 0, 0)
как цвет и анимировать alpha
, или измените его на основе смещения прокрутки.
Вот как я это сделал. Ключ должен был использовать Paint с его альфа-настройкой, чтобы я хотел.
public class Page07AnimationView extends ParentPageAnimationView {
private final String TAG = this.getClass().getSimpleName();
private Bitmap bitmap;
private BitmapDrawable drawable;
private ImageView overlay;
private int which = -1;
private long last_time;
private Page07State state;
private int mAlpha;
private int maxAlpha;
private Paint mPaint;
private int _alpha_step;
private int minAlpha;
public enum Page07State {
WAITING, DARKENING, DARKENED
}
public Page07AnimationView(Context context) {
super(context);
}
public Page07AnimationView(Context context, AttributeSet attrs) {
super(context, attrs);
}
protected void init()
{
minAlpha = 0;
mAlpha = minAlpha;
_alpha_step = 5;
maxAlpha = 255;
mPaint = new Paint();
mPaint.setAlpha(minAlpha);
state = Page07State.WAITING;
overlay = new ImageView(mContext);
overlay.setImageResource(R.drawable.black_background);
drawable = (BitmapDrawable) overlay.getDrawable();
bitmap = drawable.getBitmap();
last_time = 0;
}
protected void draw_bitmaps(Canvas canvas)
{
if(state != Page07State.WAITING)
{
DebugLog.d(TAG, "drawing " + Integer.toString(which));
canvas.drawBitmap(bitmap, 0, 0, mPaint);
}
update_bitmaps();
invalidate();
}
public void update_bitmaps()
{
if(state == Page07State.DARKENING)
{
if(mAlpha < maxAlpha)
{
if(System.currentTimeMillis() > last_time + 12)
{
last_time = System.currentTimeMillis();
mAlpha += _alpha_step;
mPaint.setAlpha(mAlpha);
}
}
else
{
state = Page07State.DARKENED;
}
}
}
public void runAnimation()
{
state = Page07State.DARKENING;
}
}
Добавление в ответ разработчика разработчика:
imageView.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY);
вы можете установитьColorFilter в любом виде, например:
GradientDrawable gd = (GradientDrawable) textView.getBackground();
gd.setColor(color); //you can also set BG color to a textview like this
gd.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY);
вы могли бы попробовать использовать альфа-анимацию, как это (возможно, на прямоугольнике):
Animation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(350);
Это приведет к тому, что прямоугольник постепенно станет непрозрачным в течение 350 секунд...
Вы должны проверить ответ iPaulPro в на этот вопрос. Вам нужно будет расширить ImageView
и переопределить метод onDraw()
.
В зависимости от того, что вы собираетесь делать, ответ Alexandru Cristescu также действителен, но вы должны вызовите setFillAter (true), чтобы анимация сохранялась после завершения.