Android atraviesa todas las vistas en la interfaz

Sobre el autor: Socio de contenido de CSDN y experto técnico, creó una aplicación con decenas de millones de usuarios diarios desde cero.
Concéntrese en compartir series originales de artículos en diversos campos, especializados en backend de Java, desarrollo móvil, realización de negocios, inteligencia artificial, etc. Espero que me apoyen mucho.

Insertar descripción de la imagen aquí

1. Introducción

Seguimos resumiendo y aprendiendo, revisando el pasado y aprendiendo lo nuevo.

2. Descripción general

Este artículo describe cómo recorrer y obtener todas las vistas de la página, y generar la identificación correspondiente, el contenido de texto de la vista de texto, el tamaño real de la vista de imagen y establecer el tamaño de la imagen.

Se puede utilizar para detectar imágenes grandes en aplicaciones de Android.

3. Practica

En el desarrollo de Android, a veces necesitamos atravesar todas las Vistas de la interfaz para poder realizar determinadas operaciones. Por ejemplo, es posible que necesitemos encontrar un tipo específico de Vista o realizar alguna operación en todas las Vistas. Aquí hay un ejemplo simple que muestra cómo iterar a través de todas las Vistas en la interfaz.
Primero, suponga que tiene una Actividad o Fragmento con un archivo de diseño que contiene varias Vistas, como Botón, Vista de texto, Vista de imagen, etc.

Luego, puede recorrer de forma recursiva todas las Vistas en el código de Actividad o Fragmento.

No hay mucho que decir, solo ve al código.

Ideas de detección del tamaño de la imagen.

    fun checkBitmapFromView(){
    
    
        //1、遍历activity中的各个View控件
        //2、获取View控件加载的Bitmap
        //3、对比Bitmap宽高与View宽高
    }

Código de muestra:
recorrer para obtener todas las vistas y generar la información correspondiente


    List<View> viewList=new ArrayList<>();
    @Override
    protected void onResume() {
    
    
        super.onResume();
        logoIcon.postDelayed(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                getAllViews((ViewGroup) getWindow().getDecorView());
                for (View view: viewList) {
    
    

                    if(view instanceof TextView) {
    
    
                        Log.d("xyz", view.toString());
                        Log.d("xyz", ((TextView)view).getText().toString());

                    } else if(view instanceof ImageView) {
    
    
                        Log.d("xyz", view.toString());
                        checkBitmap(view, ((ImageView)view).getDrawable());
                    } else {
    
    
                        Log.d("xyz", view.toString());
                    }
                }
            }
        }, 3000);
    }

    //获取所有的子view,我们这里只保存imageview及textview,用于测试
    private List<View> getAllViews(ViewGroup viewGroup){
    
    
        for(int i=0;i< viewGroup.getChildCount(); i++){
    
    
            View view = viewGroup.getChildAt(i);
            if(view instanceof ViewGroup) {
    
    
                getAllViews((ViewGroup) view);
            } else {
    
    
                if(view instanceof ImageView || view instanceof TextView) {
    
    
                    viewList.add(view);
                }
                if(view.getVisibility() == View.VISIBLE) {
    
    
                }
            }
        }
        return viewList;
    }

Este código de muestra recorrerá todas las vistas de la interfaz y agregará una vista de imagen y una vista de texto a la lista. Tenga en cuenta que aquí se utiliza un método recursivo para atravesar todas las subvistas en ViewGroup. Si la Vista es un Grupo de Vistas (como RelativeLayout, LinearLayout, etc.), entonces recorremos recursivamente todas sus Vistas secundarias. Si la Vista es una vista de hoja (como Botón, Vista de texto, etc.), realizamos la operación deseada.

Después de obtener la vista de imagen en la página, podemos realizar algunas operaciones, como
la detección del tamaño de ImageView.


    private void checkBitmap(Object thiz, Drawable drawable) {
    
    
        if (drawable instanceof BitmapDrawable && thiz instanceof View) {
    
    
            final Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

            final View view = (View) thiz;
            int width = view.getWidth();
            int height = view.getHeight();

            if (bitmap != null) {
    
    
                if (width > 0 && height > 0) {
    
    
                    // 图标宽高都大于view带下的2倍以上,则警告
                    if (bitmap.getWidth() >= (width << 1)
                            && bitmap.getHeight() >= (height << 1)) {
    
    
//                        warn(bitmap.getWidth(), bitmap.getHeight(), width, height, new RuntimeException("Bitmap size too large"));
                    }
                    warn(bitmap.getWidth(), bitmap.getHeight(), width, height, new RuntimeException("log"));
                } else {
    
    
                    final Throwable stackTrace = new RuntimeException();
                    view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    
    
                        @Override
                        public boolean onPreDraw() {
    
    
                            int w = view.getWidth();
                            int h = view.getHeight();
                            if (w > 0 && h > 0) {
    
    
                                if (bitmap.getWidth() >= (w << 1)
                                        && bitmap.getHeight() >= (h << 1)) {
    
    
//                                    warn(bitmap.getWidth(), bitmap.getHeight(), w, h, stackTrace);
                                }
                                warn(bitmap.getWidth(), bitmap.getHeight(), w, h, stackTrace);
                                view.getViewTreeObserver().removeOnPreDrawListener(this);
                            }
                            return true;
                        }
                    });
                }
            } else {
    
    

                warn(bitmap.getWidth(), bitmap.getHeight(), width, height, new RuntimeException("bitmap null"));
            }
        }
    }

    private void warn(int bitmapWidth, int bitmapHeight, int viewWidth, int viewHeight, Throwable t) {
    
    
        String warnInfo = new StringBuilder("Bitmap info: ")
                .append("\n real size: (").append(bitmapWidth).append(',').append(bitmapHeight).append(')')
                .append("\n desired size: (").append(viewWidth).append(',').append(viewHeight).append(')')
                .append("\n call stack trace: \n").append(Log.getStackTraceString(t)).append('\n')
                .toString();

        Log.d("xyz", warnInfo);
    }

Echemos un vistazo a la salida del registro.

com.xxx.xxx.xxx.ImageViewFor{
    
    e292c7e VFED..C.. ........ 540,1348-900,1528 #7f0a024e app:id/bt_phone}
2023-08-23 18:28:47.956 12556-12556 xyz                com.xxx.xxx                      D  Bitmap info: 
         real size: (144,144)
         desired size: (360,180)
         call stack trace: 
        java.lang.RuntimeException: log
            at com.xxx.xxx.ui.LoginActivity.checkBitmap(LoginActivity.java:235)
            at com.xxx.xxx.ui.LoginActivity.access$100(LoginActivity.java:79)
            at com.xxx.xxx.ui.LoginActivity$2.run(LoginActivity.java:193)
            at android.os.Handler.handleCallback(Handler.java:900)
            at android.os.Handler.dispatchMessage(Handler.java:103)
            at android.os.Looper.loop(Looper.java:219)
            at android.app.ActivityThread.main(ActivityThread.java:8673)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)

4. Lectura recomendada

columna java

Columna SQL

Estructuras de datos y algoritmos

columna de aprendizaje de Android

dddd

Supongo que te gusta

Origin blog.csdn.net/fumeidonga/article/details/133070036
Recomendado
Clasificación