通过Activity设置自定义View中的属性无效

细嗅v蔷薇 2018-03-22 11:22:30
我在一个自定义的view中设置了一个循环执行的动画,然后在activity中使用这个view,希望通过
点击能够停止动画的执行,首先我尝试在view中提供有一个public的方法,在activity中
点击的时候,通过这个方法调用动画的cancel()方法来结束,但是没有成功,之后我尝试在
view中设置一个boolean值,通过这个值判断动画是否应该执行,同时提供public void set
方法来设置这个值,并通过invalidate()来重绘整个view,但是在Activity中调用这个方法之后
还是没有任何效果!请大神来看看是怎么回事!
...全文
913 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
江三木洛 2018-03-23
  • 打赏
  • 举报
回复
引用 10 楼 ffa_ijj 的回复:
[quote=引用 8 楼 xw13782513621 的回复:] [quote=引用 7 楼 ffa_ijj 的回复:] [quote=引用 6 楼 xw13782513621 的回复:] 。。。。。你的停止动画的逻辑判断有问题 animator != null && !animator.isStarted() 如果动画不为空,且动画没开始才去取消?????? animator != null && animator.isStarted() 多个非的判断
[/quote] 不好意思,说错了,super()下面的那个判断,如果动画不为空并且已经开始,那就直接返回,那如果我在fragment中设置了对type设置了不同的值,这样就不会重绘了啊[/quote] 在这讨论太麻烦了,可以的话做个demo发我邮箱774978377@qq.com,我去瞅瞅
江三木洛 2018-03-23
  • 打赏
  • 举报
回复
引用 10 楼 ffa_ijj 的回复:
[quote=引用 8 楼 xw13782513621 的回复:] [quote=引用 7 楼 ffa_ijj 的回复:] [quote=引用 6 楼 xw13782513621 的回复:] 。。。。。你的停止动画的逻辑判断有问题 animator != null && !animator.isStarted() 如果动画不为空,且动画没开始才去取消?????? animator != null && animator.isStarted() 多个非的判断
恩恩,这个确实是我判断错了,但是我取消了这个判断,在fragment中点击还是没有取消动画,而且我尝试在取消动画哪里打印一句话,这个log信息只打印了一次,之后点击就不会出现这个log信息了[/quote] [/quote] 不好意思,说错了,super()下面的那个判断,如果动画不为空并且已经开始,那就直接返回,那如果我在fragment中设置了对type设置了不同的值,这样就不会重绘了啊[/quote] 那就有点迷糊了,还有你的自定义控件的代码根本就没发全啊,能来个完整版的不
细嗅v蔷薇 2018-03-23
  • 打赏
  • 举报
回复
引用 8 楼 xw13782513621 的回复:
[quote=引用 7 楼 ffa_ijj 的回复:] [quote=引用 6 楼 xw13782513621 的回复:] 。。。。。你的停止动画的逻辑判断有问题 animator != null && !animator.isStarted() 如果动画不为空,且动画没开始才去取消?????? animator != null && animator.isStarted() 多个非的判断
恩恩,这个确实是我判断错了,但是我取消了这个判断,在fragment中点击还是没有取消动画,而且我尝试在取消动画哪里打印一句话,这个log信息只打印了一次,之后点击就不会出现这个log信息了[/quote] @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (animator != null && animator.isStarted()) { return; } paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); //如果是wifi没有连接,绘制一个从中心向外面辐射的红色圆形,表示wifi没有连接 switch (type) { case TYPE_WIFI_DISCONNECT: drawDisconnectWifi(paint, canvas); break; case TYPE_WIFI_ERROR: drawErrorWifi(paint, canvas); break; case TYPE_WIFI_RIGHT: drawRightWifi(paint, canvas); break; case TYPE_SIGN_SUCCESS: drawSignSuccess(paint, canvas); break; } } onDraw方法改成这样试试 每次控件重绘都会调用onDraw方法,这样按你的做法每次都会调用tipAnimation,每次都会又开启一个动画,你停止的只是最后一个动画[/quote] 不好意思,说错了,super()下面的那个判断,如果动画不为空并且已经开始,那就直接返回,那如果我在fragment中设置了对type设置了不同的值,这样就不会重绘了啊
细嗅v蔷薇 2018-03-23
  • 打赏
  • 举报
回复
引用 8 楼 xw13782513621 的回复:
[quote=引用 7 楼 ffa_ijj 的回复:] [quote=引用 6 楼 xw13782513621 的回复:] 。。。。。你的停止动画的逻辑判断有问题 animator != null && !animator.isStarted() 如果动画不为空,且动画没开始才去取消?????? animator != null && animator.isStarted() 多个非的判断
恩恩,这个确实是我判断错了,但是我取消了这个判断,在fragment中点击还是没有取消动画,而且我尝试在取消动画哪里打印一句话,这个log信息只打印了一次,之后点击就不会出现这个log信息了[/quote] @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (animator != null && animator.isStarted()) { return; } paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); //如果是wifi没有连接,绘制一个从中心向外面辐射的红色圆形,表示wifi没有连接 switch (type) { case TYPE_WIFI_DISCONNECT: drawDisconnectWifi(paint, canvas); break; case TYPE_WIFI_ERROR: drawErrorWifi(paint, canvas); break; case TYPE_WIFI_RIGHT: drawRightWifi(paint, canvas); break; case TYPE_SIGN_SUCCESS: drawSignSuccess(paint, canvas); break; } } onDraw方法改成这样试试 每次控件重绘都会调用onDraw方法,这样按你的做法每次都会调用tipAnimation,每次都会又开启一个动画,你停止的只是最后一个动画[/quote] 首先呢,在super()下面那个判断我觉得有问题,这样第一次就不会绘制任何内容了,因为animator一开始就是空的,第二,我做了一个animatorStatus的判断,如果这个值为false,就不会启动动画,我在fragment中通过点击事件将这个值置为false,打断点也显示这个值为false了,然后再调用重绘的方法,这个动画还是没有停
细嗅v蔷薇 2018-03-23
  • 打赏
  • 举报
回复
引用 12 楼 xw13782513621 的回复:
[quote=引用 10 楼 ffa_ijj 的回复:] [quote=引用 8 楼 xw13782513621 的回复:] [quote=引用 7 楼 ffa_ijj 的回复:] [quote=引用 6 楼 xw13782513621 的回复:] 。。。。。你的停止动画的逻辑判断有问题 animator != null && !animator.isStarted() 如果动画不为空,且动画没开始才去取消?????? animator != null && animator.isStarted() 多个非的判断
[/quote] 不好意思,说错了,super()下面的那个判断,如果动画不为空并且已经开始,那就直接返回,那如果我在fragment中设置了对type设置了不同的值,这样就不会重绘了啊[/quote] 在这讨论太麻烦了,可以的话做个demo发我邮箱774978377@qq.com,我去瞅瞅[/quote] 嗯嗯好的
十二月的消亡 2018-03-22
  • 打赏
  • 举报
回复
点击事件应该写在你自定义view本身的代码里面
江三木洛 2018-03-22
  • 打赏
  • 举报
回复
自定义View的代码呢
江三木洛 2018-03-22
  • 打赏
  • 举报
回复
引用 7 楼 ffa_ijj 的回复:
[quote=引用 6 楼 xw13782513621 的回复:] 。。。。。你的停止动画的逻辑判断有问题 animator != null && !animator.isStarted() 如果动画不为空,且动画没开始才去取消?????? animator != null && animator.isStarted() 多个非的判断
恩恩,这个确实是我判断错了,但是我取消了这个判断,在fragment中点击还是没有取消动画,而且我尝试在取消动画哪里打印一句话,这个log信息只打印了一次,之后点击就不会出现这个log信息了[/quote] @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (animator != null && animator.isStarted()) { return; } paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); //如果是wifi没有连接,绘制一个从中心向外面辐射的红色圆形,表示wifi没有连接 switch (type) { case TYPE_WIFI_DISCONNECT: drawDisconnectWifi(paint, canvas); break; case TYPE_WIFI_ERROR: drawErrorWifi(paint, canvas); break; case TYPE_WIFI_RIGHT: drawRightWifi(paint, canvas); break; case TYPE_SIGN_SUCCESS: drawSignSuccess(paint, canvas); break; } } onDraw方法改成这样试试 每次控件重绘都会调用onDraw方法,这样按你的做法每次都会调用tipAnimation,每次都会又开启一个动画,你停止的只是最后一个动画
细嗅v蔷薇 2018-03-22
  • 打赏
  • 举报
回复
引用 6 楼 xw13782513621 的回复:
。。。。。你的停止动画的逻辑判断有问题 animator != null && !animator.isStarted() 如果动画不为空,且动画没开始才去取消?????? animator != null && animator.isStarted() 多个非的判断
恩恩,这个确实是我判断错了,但是我取消了这个判断,在fragment中点击还是没有取消动画,而且我尝试在取消动画哪里打印一句话,这个log信息只打印了一次,之后点击就不会出现这个log信息了
江三木洛 2018-03-22
  • 打赏
  • 举报
回复
。。。。。你的停止动画的逻辑判断有问题 animator != null && !animator.isStarted() 如果动画不为空,且动画没开始才去取消?????? animator != null && animator.isStarted() 多个非的判断
细嗅v蔷薇 2018-03-22
  • 打赏
  • 举报
回复
引用 1 楼 xw13782513621 的回复:
自定义View的代码呢
刚才发了代码不知道为啥不见了:

//当前的状态
    private int type = TYPE_WIFI_DISCONNECT;//默认情况下是WIFI没有连接
    //关闭或者启动动画
    private boolean animationStatus = true;//默认启动

    //定义最小需要的大小
    private int width = 400;
    private int height = 400;

    //paint的着色器
    private Shader wifiTypeShader;

    private ObjectAnimator animator;

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

    public CustomSignView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        //在这里引用自定义属性
        TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.CustomSignView);
        type = typedArray.getInteger(R.styleable.CustomSignView_sign_status,TYPE_WIFI_DISCONNECT);
        animationStatus = typedArray.getBoolean(R.styleable.CustomSignView_animation_status,true);
        typedArray.recycle();
    }

    public CustomSignView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.FILL);
        //如果是wifi没有连接,绘制一个从中心向外面辐射的红色圆形,表示wifi没有连接
        switch (type) {
            case TYPE_WIFI_DISCONNECT:
                drawDisconnectWifi(paint, canvas);
                break;
            case TYPE_WIFI_ERROR:
                drawErrorWifi(paint, canvas);
                break;
            case TYPE_WIFI_RIGHT:
                drawRightWifi(paint,canvas);
                break;
            case TYPE_SIGN_SUCCESS:
                drawSignSuccess(paint,canvas);
                break;
        }


    }

    //绘制WIFI没有连接的图案
    private void drawDisconnectWifi(Paint paint, Canvas canvas) {
        wifiTypeShader = new RadialGradient(width / 2, height / 2, width / 4, Color.WHITE, Color.RED, Shader.TileMode.CLAMP);
        paint.setShader(wifiTypeShader);
        canvas.drawCircle(width / 2, height / 2, width / 2, paint);
        //绘制文字
        drawWifiText("wifi未连接", "无法签到", canvas);
        tipAnimation();
    }
//启动动画
    private void tipAnimation() {
        if(animationStatus) {
            animator = ObjectAnimator.ofFloat(this, "rotation", 0f, 360f);
            animator.setDuration(5000);
            animator.setRepeatCount(ValueAnimator.INFINITE);
            animator.setRepeatMode(ValueAnimator.RESTART);
            animator.setInterpolator(new LinearInterpolator());//匀速运动
            animator.start();
        }
    }
 //停止动画
    public void stopAnimation(){
        if(animator != null && !animator.isStarted()){
            animator.cancel();
            animator.end();
        }
    }

细嗅v蔷薇 2018-03-22
  • 打赏
  • 举报
回复
引用 2 楼 lllx9464 的回复:
点击事件应该写在你自定义view本身的代码里面
点击事件写在里面也没有用,下面有我写的的代码,麻烦您看一下
细嗅v蔷薇 2018-03-22
  • 打赏
  • 举报
回复
引用 1 楼 xw13782513621 的回复:
自定义View的代码呢
代码在这里:

 //定义最小需要的大小
    private int width = 400;
    private int height = 400;

    //paint的着色器
    private Shader wifiTypeShader;

    private ObjectAnimator animator;
//当前的状态
    private int type = TYPE_WIFI_DISCONNECT;//默认情况下是WIFI没有连接
    //关闭或者启动动画
    private boolean animationStatus = true;//默认启动
 public CustomSignView(Context context) {
        super(context);
    }

    public CustomSignView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        //在这里引用自定义属性
        TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.CustomSignView);
        type = typedArray.getInteger(R.styleable.CustomSignView_sign_status,TYPE_WIFI_DISCONNECT);
        animationStatus = typedArray.getBoolean(R.styleable.CustomSignView_animation_status,true);
        typedArray.recycle();
    }

    public CustomSignView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.FILL);
        //如果是wifi没有连接,绘制一个从中心向外面辐射的红色圆形,表示wifi没有连接
        switch (type) {
            case TYPE_WIFI_DISCONNECT:
                drawDisconnectWifi(paint, canvas);
                break;
            case TYPE_WIFI_ERROR:
                drawErrorWifi(paint, canvas);
                break;
            case TYPE_WIFI_RIGHT:
                drawRightWifi(paint,canvas);
                break;
            case TYPE_SIGN_SUCCESS:
                drawSignSuccess(paint,canvas);
                break;
        }


    }
//绘制WIFI没有连接的图案
    private void drawDisconnectWifi(Paint paint, Canvas canvas) {
        wifiTypeShader = new RadialGradient(width / 2, height / 2, width / 4, Color.WHITE, Color.RED, Shader.TileMode.CLAMP);
        paint.setShader(wifiTypeShader);
        canvas.drawCircle(width / 2, height / 2, width / 2, paint);
        //绘制文字
        drawWifiText("wifi未连接", "无法签到", canvas);
        tipAnimation();
    }
//启动动画
    private void tipAnimation() {
        if(animationStatus) {
            animator = ObjectAnimator.ofFloat(this, "rotation", 0f, 360f);
            animator.setDuration(5000);
            animator.setRepeatCount(ValueAnimator.INFINITE);
            animator.setRepeatMode(ValueAnimator.RESTART);
            animator.setInterpolator(new LinearInterpolator());//匀速运动
            animator.start();
        }
    }

 //停止动画
    public void stopAnimation(){
        if(animator != null && !animator.isStarted()){
            animator.cancel();
            animator.end();
        }
    }


}
上面是View,这个View我在fargment中引用

    private CustomSignView signView;


    @Override
    protected void initView() {
        view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_home_sign,null);
        signView = view.findViewById(R.id.sv_sign_view);

    }

    @Override
    protected void initListener() {
        super.initListener();
        signView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        super.onClick(v);
        switch(v.getId()){
            case R.id.sv_sign_view:
                signView.stopAnimation();
                break;
        }
    }
这个在fragment中调用

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧