Android 特效View第三弹之闪烁View

Android  特效View第三弹之闪烁View

动态效果图我只做了半天还是失败了,给一个截图,剩下的全靠想象了

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <com.example.empty.FlickerTextView
            android:id="@+id/flicker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top|left"
            android:text="Happy"
            android:textColor="#00FF00"
            android:textSize="24dp" />

        <com.example.empty.FlickerText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|right"
            android:alpha="1"
            android:text="Today"
            android:textColor="#0000FF"
            android:textSize="24dp" />

        <com.example.empty.FlikerImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/ic_launcher"/>
    </FrameLayout>
package com.example.empty;

import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.widget.TextView;

public class FlickerTextView extends TextView{
    boolean change = false;
    private Handler handler = null;

    public FlickerTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        startFlicker();
    }

    @SuppressLint("HandlerLeak")
    public void startFlicker(){
        handler = new Handler(){
            @Override
            public void dispatchMessage(Message msg) {
                if(change){
                    change = false;
                    setTextColor(Color.TRANSPARENT); //这个是透明,=看不到文字
                }else{
                    change = true;
                    setTextColor(Color.RED);
                }
            }
        };

        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                Message msg = new Message();
                handler.sendMessage(msg);
            }
        };
        timer.schedule(task,1,300);  //参数分别是delay(多长时间后执行),duration(执行间隔)
    }

}
package com.example.empty;

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

public class FlickerText extends TextView{

    public FlickerText(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    interface STATE{
        static final int VISIBLE = 1;
        static final int INVISIBLE = 0;
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        switch(getAlphastate()){
        case STATE.VISIBLE:{
            setAlpha(STATE.INVISIBLE);
            break;
        }
        case STATE.INVISIBLE:{
            setAlpha(STATE.VISIBLE);
            break;
        }
        }
        postInvalidateDelayed(300);
    }

    public int getAlphastate(){
        return (int)getAlpha()== STATE.INVISIBLE ? STATE.INVISIBLE:STATE.VISIBLE;
    }

}
package com.example.empty;

import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.widget.ImageView;

public class FlikerImageView extends ImageView {

    boolean change = false;

    public FlikerImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        startFlicker();
    }

    interface STATE {
        static final int VISIBLE = 255;
        static final int INVISIBLE = 0;
    }

    private Handler handler = new Handler() {
        @Override
        public void dispatchMessage(Message msg) {
            if (change) {
                change = false;
                setImageAlpha(STATE.INVISIBLE);
            } else {
                change = true;
                setImageAlpha(STATE.VISIBLE);
            }
        }
    };

    public void startFlicker() {

        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                Message msg = new Message();
                handler.sendMessage(msg);
            }
        };
        timer.schedule(task, 1, 300);
    }

}

我这里给出了3种实现方案(其实是两种)来实现达到View闪烁的效果。

这里简单说明一下2种方案的思路

第一种我们通过Timer定时改变View的状态

第二种通过postInvalidateDelayed来每隔一段时间进行一次重绘。

然后我们改变View也是通过2种方式

一、setColor 二、setAlpha

当然,我们还可以通过一段动画(anim)来实现。但是原理是相同的

这里我推荐的方式是postInvalidateDelayed + setAlpha来实现

但是在ImageVIew种当你调用setAlpha时系统会自动调用Invalidate(onDraw),这时你的图片就会一直处于闪烁状态

这里我们就只能采用Timer和动画来实现了

时间: 2024-10-12 13:55:17

Android 特效View第三弹之闪烁View的相关文章

Android 特效View第四弹之折线图 心率图

Android 特效View第四弹之折线图 心率图 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.empty.ChartView android:id="@+id/chart" android:layout_width="wrap_content" and

Android Window PhoneWindow Activity学习心得--第三弹

Android Window  PhoneWindow Activity学习心得--第三弹 前面 我们完成了从Activity到PhoneWindow的整体跨度 正如我们所知道的与Activity组件关联的一个应用程序窗口视图对象关联一个ViewRoot对象,而将 一个Activity组件的应用程序窗口视图对象与一个ViewRoot对象关联是通过该Activity组件所使用的 窗口管理器(WindowManager)来执行的. 在我们初始化DecorView完成之后,我们需要关联应用程序窗口视图

Android 开发第三弹:自定义左右菜单(滑动动画+蒙版效果)

下面的截图--哎,因为1080P在Windows 10上虽然适配了,但大部分软件并没有跟上,比如某个录制GIF的软件,所以这里有一定的偏移导致画面不完整,但效果大概就是这么一个效果了. MainUI.java 首先需要这么一个类,在这里一些UI的滑动呀之类的都会定义.首先吧,定义好这些变量,当然了,实际开发过程中肯定需要哪一个就添加上哪一个的. private Context context; // 上下文 private FrameLayout leftMenu; // 左边部分 privat

Android高手进阶教程(三)之----Android 中自定义View的应用.

大家好我们今天的教程是在Android 教程中自定义View 的学习,对于初学着来说,他们习惯了Android 传统的页面布局方式,如下代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertic

android PopupWindow实现从底部弹出或滑出选择菜单或窗口

本实例弹出窗口主要是继承PopupWindow类来实现的弹出窗体,布局可以根据自己定义设计.弹出效果主要使用了translate和alpha样式实现,具体实习如下: 第一步:设计弹出窗口xml: Xml代码   <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

[爱上Swift]第三弹:使用Swift建立App基本基石

搭架子 首先这次我们会主要使用IOS自带的导航Controller为一个APP建立一个简单的基石, 新建一个空的Application并创建3个swift文件,分别命名为:FirstViewController,SecondViewController,ThirdViewController; 同时在三个Swift的Controller中重写继承类的viewDidLoad()方法: override func viewDidLoad(){ super.viewDidLoad(); } 在整个程序

Android高手速成--第一部分 个性化控件(View)

第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style等等..其他 一.ListView android-pulltorefresh一个强大的拉动刷新开源项目,支持各种控件下拉刷新

android :点击某个按钮弹出在原有布局中没有(或者存在)内容 :以删除原有布局内容为例

主要涉及了(1)对布局中某个控件的监听 (2)在布局文件中设置可显示,删除的参数 visibility的参数的有三个,在这里我只设置了一个,可见的. android:visibility="visible" 剩下的和他的用法相同. (3)在代码中监听控件后,对visibility的参数重新设置. 效果图:点击按钮后edittext不见了 (1)点击高级按钮前 (2)点击高级按钮后 (1)布局文件 <?xml version="1.0" encoding=&qu

Android特效专辑(八)——实现心型起泡飞舞的特效,让你的APP瞬间暖心

Android特效专辑(八)--实现心型起泡飞舞的特效,让你的APP瞬间暖心 马上也要放年假了,家里估计会没网,更完这篇的话,可能要到年后了,不过在此期间会把更新内容都保存在本地,这样有网就可以发表了,也是极好的,今天说的这个特效,原本是Only上的一个小彩蛋的,我们来看看图片 只要我点击了Only这个字,下面就开始上升起起泡了,这个实现起来其实就是一个欲盖弥彰的动画而已,准备好三张颜色不一样的心型图片咯,这样的话,我们就开始动手来写一写吧! 首先新建一个工程--HeartFaom 准备工作就是