Quiero extender LinearLayout así que cuando mi diseño se dibuja una sombra se agrega debajo de ella. He jugado alrededor de la invalidación de la onDraw método, pero estoy un poco perdido. Cualquier ayuda con esto o incluso de una biblioteca sugerencia sería muy apreciada!

He aquí un ejemplo de la sombra punto de vista que estoy tratando de lograr. No creo que yo pueda usar un nueve parche aquí porque necesito el contenido de la vista dentro de la caja blanca. Esto significaría que tendría que saber la distancia entre el borde y el final del PNG. Sin embargo, creo pantalla diferentes densidades de decir que esta distancia será siempre la misma PX, pero no de la misma DP.

Para ser claro necesito una manera de extender la Vista de clase, de modo que una sombra se dibuja debajo de ella cuando se agrega a un diseño. No XML o 9Patch soluciones por favor.

Ampliación de Android de Vista de clase para agregar una sombra

Gracias

Jack

Creo que se podría dibujar un negro rect que tiene el tamaño de su vista y, a continuación, en la parte superior de dibujar su punto de vista, pero traducido un poco a los de abajo y a la derecha (o hacia abajo y a la izquierda, lo que quieras).
Podría por favor explicar en detalle cómo se podría hacer esto?
Here's an example. I can't use a 9-Patch either ¿Por qué no? El mejor y más fácil.
necesito para garantizar que el contenido de la vista no fluya fuera de las casillas blancas de la frontera. Así que voy a necesitar para agregar relleno para el contenedor. Pero, ¿cómo voy a saber donde esta frontera es si el 9-Patch se estira para diferentes tamaños?
Yo no entiendo lo que acabo de decir, pero confía en mí 9-patch es el camino a seguir. Causa que he hecho. Aquí es un ejemplo. Sólo asegúrese de definir correctamente qué partes debe no ser estirada y que la zona tiene contenido.

OriginalEl autor JackMahoney | 2013-02-18

3 Comentarios

  1. 14

    Estoy de acuerdo con los comentarios sobre tu pregunta: programático dropshadow efecto es una mala elección, y usted podría conseguir el mismo efecto con un simple 9patch (o un conjunto de ellos) como se dijo aquí.

    Por CIERTO me fue muy curioso, y me terminó con la piratería una solución después del trabajo.

    El código que se presenta es una prueba, y debe ser concebido como una simple prueba de concepto (así que por favor no downvote). Algunas de las operaciones que se muestran son bastante caro, y puede en serio impacto sobre las actuaciones (Hay muchos ejemplos alrededor, mira aquí, aquí para tener una idea). Debe ser una solución de último recurso sólo para un componente muestra una vez-en-un-tiempo.

    public class BalloonView extends TextView {
    protected NinePatchDrawable bg;
    protected Paint paint;
    protected Rect padding = new Rect();
    protected Bitmap bmp;
    public BalloonView(Context context) {
    super(context);
    init();
    }
    public BalloonView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
    }
    public BalloonView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
    }
    @SuppressLint("NewApi")
    protected void init() {
    //decode the 9patch drawable
    bg = (NinePatchDrawable) getResources().getDrawable(R.drawable.balloon);
    //get paddings from the 9patch and apply them to the View
    bg.getPadding(padding);
    setPadding(padding.left, padding.top, padding.right, padding.bottom);
    //prepare the Paint to use below
    paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(Color.rgb(255,255,255));
    paint.setStyle(Style.FILL);
    //this check is needed in order to get this code
    //working if target SDK>=11
    if( Build.VERSION.SDK_INT >= 11 )
    setLayerType(View.LAYER_TYPE_SOFTWARE, paint);
    //set the shadowLayer
    paint.setShadowLayer(
    padding.left * .2f, //radius
    0f, //blurX
    padding.left * .1f, //blurY
    Color.argb(128, 0, 0, 0) //shadow color
    );
    }
    @Override
    protected void onDraw(Canvas canvas) {
    int w = getMeasuredWidth();
    int h = getMeasuredHeight();
    //set 9patch bounds according to view measurement
    //NOTE: if not set, the drawable will not be drawn
    bg.setBounds(0, 0, w, h);
    //this code looks expensive: let's do once
    if( bmp == null ) {
    //it seems like shadowLayer doesn't take into account
    //alpha channel in ARGB_8888 sources...
    bmp = Bitmap.createBitmap(w, h, Config.ARGB_8888);
    //draw the given 9patch on the brand new bitmap
    Canvas tmp = new Canvas(bmp);
    bg.draw(tmp);
    //extract only the alpha channel
    bmp = bmp.extractAlpha();
    }
    //this "alpha mask" has the same shape of the starting 9patch,
    //but filled in white and **with the dropshadow**!!!!
    canvas.drawBitmap(bmp, 0, 0, paint);
    //let's paint the 9patch over...
    bg.draw(canvas);
    super.onDraw(canvas);
    }
    }

    Primero de todos con el fin de obtener programática de sombra, tendrá que lidiar con Paint.setShadowLayer(...) como se dijo aquí. Básicamente, se debe definir un capa de la sombra para la Paint objeto que se utiliza para dibujar en la Canvas de la vista personalizada. Desafortunadamente, usted no puede utilizar una Paint objeto para dibujar un NinePatchDrawable, por lo que necesita para convertirlo en un mapa de bits (1ª hack). Además parece que la sombra de las capas no puede trabajar correctamente con ARGB_8888 imágenes, por lo que la única manera que he encontrado para conseguir un correcto sombra ha sido para dibujar la máscara alfa de la NinePatchDrawable (2ª hack), justo debajo de sí mismo.

    He aquí un par de sshots (probado en Android [email protected] y [email protected])
    Ampliación de Android de Vista de clase para agregar una sombra
    Ampliación de Android de Vista de clase para agregar una sombra

    Edición: acaba de ser minucioso, os adjunto el 9patch utilizado en la prueba (que se encuentra en res/drawable/mdpi)
    Ampliación de Android de Vista de clase para agregar una sombra

    Gracias por la respuesta voy a probar. Pero no estoy de acuerdo acerca de la 9Patch. El nonstretched áreas de una 9Patch no se escalan para cada densidad de pantalla para que se parezcan más pequeños en pantallas de alta densidad – por lo tanto la sombra de área será menor y no voy a saber dónde colocar a los niños del contenedor con relleno
    lo siento pero te equivocas. Sólo mira las capturas de pantalla de arriba: hay 2 diferentes dispositivos reales: 320×480|mdpi, 720×1280|xhdpi. En ambos casos el mismo 9patch se utiliza. Se puede medir la ronda de los rincones del globo en píxeles en cada sshot y te darás cuenta de que en xhdpi es 2x amplia que en mdpi. También rellenos (definido en el 9patch) escala en consecuencia.
    por favor, puedes agregar un proyecto de ejemplo para mí ?

    OriginalEl autor a.bertucci

  2. 3

    Probar esta técnica.

    container_dropshadow.xml

    `

     <!-- Drop Shadow Stack -->
    <item>
    <shape>
    <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
    <solid android:color="#00CCCCCC" />
    </shape>
    </item>
    <item>
    <shape>
    <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
    <solid android:color="#10CCCCCC" />
    </shape>
    </item>
    <item>
    <shape>
    <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
    <solid android:color="#20CCCCCC" />
    </shape>
    </item>
    <item>
    <shape>
    <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
    <solid android:color="#30CCCCCC" />
    </shape>
    </item>
    <item>
    <shape>
    <padding android:top="1dp" android:right="1dp" android:bottom="1dp" android:left="1dp" />
    <solid android:color="#50CCCCCC" />
    </shape>
    </item>
    <!-- Background -->
    <item>
    <shape>
    <solid android:color="@color/white" />
    <corners android:radius="3dp" />
    </shape>
    </item>

    A continuación, se puede aplicar a un XML de diseño como un fondo como

    LinearLayout android:background=»@dibujable/container_dropshadow»

    `

    Hm esto se ve un poco inquietos. Puede explicar cuál es la idea detrás de esto es. Parece que acaba de apilar una serie de la caja en la parte superior de uno al otro. Que no crear un gradiente.
    Creo que el problema es su lado, Michael también se sugirió una lógica. Pero Se dijo a favor de elaborar. Yo soy también mostró una sugerencia. Pero usted dijo lo mismo, por favor explique. Primero tenemos que buscar en google. Muchas de las cosas que hay ahí. si usted no puede encontrar la solución exacta, a continuación, vienen de desbordamiento de la pila y, a continuación, plantear su pregunta. No podemos enviar completa fragmento de hacer su trabajo. Gracias por la comprensión. Todo lo Mejor:)
    La respuesta es errónea. El relleno de cada elemento es el mismo, por lo que crea un sólido de color de un gradiente

    OriginalEl autor AndroidEnthusiastic

  3. 3

    Esta es la forma más sencilla de abandonar la sombra a cualquier cosa ya sea de diseño, botón, etc.
    background.xml

        <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item >
    <shape 
    android:shape="rectangle">
    <solid android:color="@android:color/darker_gray" />
    <corners android:radius="5dp"/>
    </shape>
    </item>
    <item android:right="1dp" android:left="1dp" android:bottom="2dp">
    <shape 
    android:shape="rectangle">
    <solid android:color="@android:color/white"/>
    <corners android:radius="5dp"/>
    </shape>
    </item>
    </layer-list>

    en su main.xml

    <LineaLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/background"
    />
    amaba esta solución! con una pequeña modificación a <sólido android:color=»@color/grey_400″/> (consulte google.com/design/spec/style/color.html#color-color-palette) y <item android:fondo=»2dp»> me podrían imitar a google play Botón.
    esto también no crear un degradado, sólo un color sólido.

    OriginalEl autor Rohit

Dejar respuesta

Please enter your comment!
Please enter your name here