安卓L的涟漪效应 - 触按键反馈 - 使用XML [英] Android L's Ripple Effect - Touch Feedback for Buttons - Using XML

查看:248
本文介绍了安卓L的涟漪效应 - 触按键反馈 - 使用XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想了解如何实现涟漪效应 - 触摸反馈按钮和其他视图。我看着荡漾在SO触控功能有关的问题,并得到了一些洞察到它。我可以用这个Java code顺利拿到了连锁反应。

 进口android.animation.ObjectAnimator;
进口android.content.Context;
进口android.graphics.Canvas;
进口android.graphics.Color;
进口android.graphics.Paint;
进口android.graphics.Path;
进口android.graphics.RadialGradient;
进口android.graphics.Region;
进口android.graphics.Shader;
进口android.support.annotation.NonNull;
进口android.util.AttributeSet;
进口android.view.MotionEvent;
进口android.view.animation.AccelerateInterpolator;
进口android.widget.Button;

公共MyButton类扩展按钮{

    私人浮动mDownX;
    私人浮动mDownY;

    私人浮动mRadius;

    私人油漆mPaint;

    公共用作MyButton(最终上下文的背景下){
        超(上下文);
        在里面();
    }

    公共用作MyButton(最终上下文的背景下,最终的AttributeSet ATTRS){
        超(背景下,ATTRS);
        在里面();
    }

    公共用作MyButton(最终上下文的背景下,最终的AttributeSet ATTRS,
            最终诠释defStyle){
        超(背景下,ATTRS,defStyle);
        在里面();
    }

    私人无效的init(){
        mPaint =新的油漆();
        mPaint.setAlpha(100);
    }

    @覆盖
    公共布尔的onTouchEvent(@NonNull最终MotionEvent事件){
        如果(event.getActionMasked()== MotionEvent.ACTION_UP){
            mDownX = event.getX();
            mDownY = event.getY();

            ObjectAnimator动画= ObjectAnimator.ofFloat(这一点,半径,0,
                    的getWidth()* 3.0F);
            animator.setInterpolator(新AccelerateInterpolator());
            animator.setDuration(400);
            animator.start();
        }
        返回super.onTouchEvent(事件);
    }

    公共无效setRadius(最终浮动半径){
        mRadius =半径;
        如果(mRadius大于0){
            的RadialGradient的RadialGradient =新的RadialGradient(mDownX,mDownY,
                    mRadius * 3,Color.TRANSPARENT,Color.BLACK,
                    Shader.TileMode.MIRROR);
            mPaint.setShader(的RadialGradient);
        }
        无效();
    }

    私人路径的mpath =新路径();
    私人路径mpath2,但是=新路径();

    @覆盖
    保护无效的OnDraw(@NonNull最后的画布油画){
        super.onDraw(画布);

        mPath2.reset();
        mPath2.addCircle(mDownX,mDownY,mRadius,Path.Direction.CW);

        canvas.clipPath(mpath2,但是);

        mPath.reset();
        mPath.addCircle(mDownX,mDownY,mRadius / 3,Path.Direction.CW);

        canvas.clipPath(的mpath,Region.Op.DIFFERENCE);

        canvas.drawCircle(mDownX,mDownY,mRadius,mPaint);
    }
}
 

不过,我想使用XML的方法。我如何实现这一目标?我已经看过和<一href="http://stackoverflow.com/questions/24480425/android-l-fab-button-shadow/24498041#24498041">this,但我还没有那个熟悉的风格,所以我发现很难达到连锁反应。

我有以下的XML code按钮:

 &LT;按钮
            机器人:ID =@ + ID / button_email
            机器人:layout_width =0dip
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_weight =0.50
            机器人:重力=中心
            机器人:文本=@字符串/邮件/&GT;
 

我如何获得此按钮连锁反应。如果有人能指导我,我会很感激。

添加ripple.xml和background.xml,正如上面的链接之一。我在水库建立了一个可绘制-V21夹,并添加下面的文件存在。

ripple.xml

 &LT; XML版本=1.0编码=UTF-8&GT?;
&LT;纹波的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:颜色=@机器人:彩色/黑白&GT;
    &LT;项目机器人:可绘制=@可绘制/背景&GT;
    &LT; /项目&GT;
&LT; /纹波&GT;
 

background.xml

 &LT; XML版本=1.0编码=UTF-8&GT?;
&LT;形状的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android&GT;
    [固体机器人:颜色=@机器人:彩色/ darker_gray/&GT;
&LT; /形状&GT;
 

我增加了波动的背景时我的按钮,这里是XML我的按钮,现在..

 &LT;按钮
    机器人:ID =@ + ID / button_email
    机器人:layout_width =0dip
    机器人:layout_height =WRAP_CONTENT
    机器人:layout_weight =0.50
    机器人:重力=中心
    机器人:背景=@可绘制/波纹
    机器人:文本=@字符串/邮件/&GT;
 

当我运行的应用程序,我收到了ResourceNotFoundException。这里是logcat的痕迹。

  07-21 17:03:39.043:E / AndroidRuntime(15710):致命异常:主要
07-21 17:03:39.043:E / AndroidRuntime(15710):工艺:com.xx.xxx,PID:15710
07-21 17:03:39.043:E / AndroidRuntime(15710):android.view.InflateException:二进制XML文件中的行#60:错误充气类&lt;未知&GT;
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.LayoutInflater.createView(LayoutInflater.java:620)
07-21 17:03:39.043:E / AndroidRuntime(15710):在com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.LayoutInflater.inflate(LayoutInflater.java:492)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.LayoutInflater.inflate(LayoutInflater.java:397)
07-21 17:03:39.043:E / AndroidRuntime(15710):在com.xx.xxx.BusinessAdapter.onCreateViewHolder(BusinessAdapter.java:106)
07-21 17:03:39.043:E / AndroidRuntime(15710):在com.xx.xxx.BusinessAdapter.onCreateViewHolder(BusinessAdapter.java:1)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.support.v7.widget.RecyclerView $ Adapter.createViewHolder(RecyclerView.java:2915)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition(RecyclerView.java:2511)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.support.v7.widget.LinearLayoutManager $ RenderState.next(LinearLayoutManager.java:1425)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:999)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:524)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1461)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:1600)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.View.layout(View.java:14817)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.ViewGroup.layout(ViewGroup.java:4631)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.View.layout(View.java:14817)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.ViewGroup.layout(ViewGroup.java:4631)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.View.layout(View.java:14817)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.ViewGroup.layout(ViewGroup.java:4631)
07-21 17:03:39.043:E / AndroidRuntime(15710):在com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.View.layout(View.java:14817)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.ViewGroup.layout(ViewGroup.java:4631)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.widget.FrameLayout.onLayout(FrameLayout.java:388)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.View.layout(View.java:14817)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.ViewGroup.layout(ViewGroup.java:4631)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1983)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1740)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5600)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:761)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.Choreographer.doCallbacks(Choreographer.java:574)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.Choreographer.doFrame(Choreographer.java:544)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.os.Handler.handleCallback(Handler.java:733)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.os.Handler.dispatchMessage(Handler.java:95)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.os.Looper.loop(Looper.java:136)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.app.ActivityThread.main(ActivityThread.java:5001)
07-21 17:03:39.043:E / AndroidRuntime(15710):在java.lang.reflect.Method.invokeNative(本机方法)
07-21 17:03:39.043:E / AndroidRuntime(15710):在java.lang.reflect.Method.invoke(Method.java:515)
07-21 17:03:39.043:E / AndroidRuntime(15710):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)
07-21 17:03:39.043:E / AndroidRuntime(15710):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
07-21 17:03:39.043:E / AndroidRuntime(15710):在dalvik.system.NativeStart.main(本机方法)
07-21 17:03:39.043:E / AndroidRuntime(15710):由:java.lang.reflect.InvocationTargetException
07-21 17:03:39.043:E / AndroidRuntime(15710):在java.lang.reflect.Constructor.constructNative(本机方法)
07-21 17:03:39.043:E / AndroidRuntime(15710):在java.lang.reflect.Constructor.newInstance(Constructor.java:423)
07-21 17:03:39.043:E / AndroidRuntime(15710):在android.view.LayoutInflater.createView(LayoutInflater.java:594)
07-21 17:03:39.043:E / AndroidRuntime(15710):50 ...更多
07-21 17:03:39.043:E / AndroidRuntime(15710):android.content.res.Resources $ NotFoundException:由造成资源不是绘制对象(彩色或路径)的TypedValue {T =为0x1 / D = 0x7f020075一个= -1 R = 0X
 

解决方案

您可以做这样的事情:

 &LT;按钮
      机器人:layout_width =WRAP_CONTENT
      机器人:layout_height =WRAP_CONTENT
      机器人:背景=@可绘制/波纹

    /&GT;
 

当ripple.xml是:

 &LT;纹波的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
                      机器人:颜色=机器人:colorControlHighlight&GT;
        &LT;项目机器人:ID =@机器人:ID /掩码&GT;
            &LT;形机器人:形状=椭圆形&GT;
                [固体机器人:颜色=?机器人:colorAccent/&GT;
            &LT; /形状&GT;
        &LT; /项目&GT;
 &LT; /纹波&GT;
 

I am trying to understand how to implement the "Ripple Effect - Touch Feedback" for buttons and other views. I looked at the questions related to Ripple touch effect on SO and got some insight into it. I was able to successfully get the ripple effect using this java code.

import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RadialGradient;
import android.graphics.Region;
import android.graphics.Shader;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.AccelerateInterpolator;
import android.widget.Button;

public class MyButton extends Button {

    private float mDownX;
    private float mDownY;

    private float mRadius;

    private Paint mPaint;

    public MyButton(final Context context) {
        super(context);
        init();
    }

    public MyButton(final Context context, final AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyButton(final Context context, final AttributeSet attrs,
            final int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        mPaint = new Paint();
        mPaint.setAlpha(100);
    }

    @Override
    public boolean onTouchEvent(@NonNull final MotionEvent event) {
        if (event.getActionMasked() == MotionEvent.ACTION_UP) {
            mDownX = event.getX();
            mDownY = event.getY();

            ObjectAnimator animator = ObjectAnimator.ofFloat(this, "radius", 0,
                    getWidth() * 3.0f);
            animator.setInterpolator(new AccelerateInterpolator());
            animator.setDuration(400);
            animator.start();
        }
        return super.onTouchEvent(event);
    }

    public void setRadius(final float radius) {
        mRadius = radius;
        if (mRadius > 0) {
            RadialGradient radialGradient = new RadialGradient(mDownX, mDownY,
                    mRadius * 3, Color.TRANSPARENT, Color.BLACK,
                    Shader.TileMode.MIRROR);
            mPaint.setShader(radialGradient);
        }
        invalidate();
    }

    private Path mPath = new Path();
    private Path mPath2 = new Path();

    @Override
    protected void onDraw(@NonNull final Canvas canvas) {
        super.onDraw(canvas);

        mPath2.reset();
        mPath2.addCircle(mDownX, mDownY, mRadius, Path.Direction.CW);

        canvas.clipPath(mPath2);

        mPath.reset();
        mPath.addCircle(mDownX, mDownY, mRadius / 3, Path.Direction.CW);

        canvas.clipPath(mPath, Region.Op.DIFFERENCE);

        canvas.drawCircle(mDownX, mDownY, mRadius, mPaint);
    }
}

But, i want to use XML approach. How do i achieve this? I have looked at this and this, but i am not yet that comfortable with styles, so i am finding it difficult to achieve the ripple effect.

I have a button with the following XML code:

 <Button
            android:id="@+id/button_email"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.50"
            android:gravity="center"
            android:text="@string/email" />

How do i get ripple effect for this button. If someone can guide me, I will be thankful.

[EDIT] Adding ripple.xml and background.xml, as mentioned in one of the links above. I have created a drawable-v21 folder in res and added the below files there.

ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@android:color/black" >
    <item android:drawable="@drawable/background">
    </item>
</ripple>

background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="@android:color/darker_gray" />
</shape>

I added the ripple as background for my button, here is the xml for my button now..

<Button
    android:id="@+id/button_email"
    android:layout_width="0dip"
    android:layout_height="wrap_content"
    android:layout_weight="0.50"
    android:gravity="center"
    android:background="@drawable/ripple"
    android:text="@string/email" />

When i run the application i get a ResourceNotFoundException. Here is the logcat trace..

07-21 17:03:39.043: E/AndroidRuntime(15710): FATAL EXCEPTION: main
07-21 17:03:39.043: E/AndroidRuntime(15710): Process: com.xx.xxx, PID: 15710
07-21 17:03:39.043: E/AndroidRuntime(15710): android.view.InflateException: Binary XML file line #60: Error inflating class <unknown>
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at com.xx.xxx.BusinessAdapter.onCreateViewHolder(BusinessAdapter.java:106)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at com.xx.xxx.BusinessAdapter.onCreateViewHolder(BusinessAdapter.java:1)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:2915)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:2511)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.support.v7.widget.LinearLayoutManager$RenderState.next(LinearLayoutManager.java:1425)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:999)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:524)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:1461)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:1600)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.View.layout(View.java:14817)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.View.layout(View.java:14817)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.View.layout(View.java:14817)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.View.layout(View.java:14817)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.View.layout(View.java:14817)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1983)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1740)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.Choreographer.doFrame(Choreographer.java:544)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.os.Handler.handleCallback(Handler.java:733)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.os.Handler.dispatchMessage(Handler.java:95)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.os.Looper.loop(Looper.java:136)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.app.ActivityThread.main(ActivityThread.java:5001)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at java.lang.reflect.Method.invokeNative(Native Method)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at java.lang.reflect.Method.invoke(Method.java:515)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at dalvik.system.NativeStart.main(Native Method)
07-21 17:03:39.043: E/AndroidRuntime(15710): Caused by: java.lang.reflect.InvocationTargetException
07-21 17:03:39.043: E/AndroidRuntime(15710):    at java.lang.reflect.Constructor.constructNative(Native Method)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
07-21 17:03:39.043: E/AndroidRuntime(15710):    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
07-21 17:03:39.043: E/AndroidRuntime(15710):    ... 50 more
07-21 17:03:39.043: E/AndroidRuntime(15710): Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x1/d=0x7f020075 a=-1 r=0x

解决方案

You can do something like this:

<Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@drawable/ripple"

    />

Where the ripple.xml is:

<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
                      android:color="?android:colorControlHighlight">
        <item android:id="@android:id/mask">
            <shape android:shape="oval">
                <solid android:color="?android:colorAccent" />
            </shape>
        </item>
 </ripple>

这篇关于安卓L的涟漪效应 - 触按键反馈 - 使用XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆