Android 对Gallery的挖掘

Gallery2分析 Gallery2主要功能是实现Android系统本地存储以及网络存储中的媒体(图片&视频)资源的浏览,媒体信息,显示和更多操作(删除、分享、选择、缩放、编辑等)。 阅读详情
一.循环Gallery

现在看一下官方API的文档,可以看到这样一句话:该类已被弃用,其他水平滚动窗口小部件包括HorizontalScrollView和ViewPager从支持库。因为这个类是API Level 1里面的,时间比较久了。虽说被弃用,也只是不再支持后续的更新,但是我们也可以用它来作为一个学习的例子。所以说即使是Gallery不让用了,我们还可以使用HorizontalScrollView和ViewPager呢。ViewPager已经说过了,今天的主角是Gallery。

  Gallery是用来水平滚动的显示一系列项目。Gallery组件可以横向显示一个图像列表,当单击当前图像的后一个图像时,这个图像列表会向左移动一格,当单击当前图像的前一个图像时,这个图像列表会向右移动一样。也可以通过拖动的方式来向左和向右移动图像列表在使用Gallery的时候,我们应指定他的背景,不然它的项目会紧凑的贴在一起,不会产生画廊的效果了。但是,你也可以通过指定Gallery的属性来设置距离,高度等参数来产生画廊的效果。显然这样做比较麻烦,除非自定义一些其他效果。

   最简单的情况是,我们在一个xml布局中添加一个Gallery,如下:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.     <Gallery   
  6.         android:layout_width="match_parent"  
  7.         android:layout_height="wrap_content"  
  8.         android:id="@+id/gallery"  
  9.         />  
  10. </RelativeLayout>  
  Gallery有几个xml属性:

  animationDuration:当布局已经改变,设置一个过渡动画应该运行多长时间(以毫秒为单位)。

  gravity:项目的位置

  spacing:设置项目之间间距

  unselectedAlpha:设置没有选择时的Alpha

  另外Gallery还有一个内部类,Gallery.LayoutParams,继承自LayoutParams,用来提供一个位置来保存当前转换信息和之前的位置转换信息。

  定义完xml文件,之后就是在是在Activity里面实例化Gallery,设置Adapter,看代码

  1. package com.example.androidgallerydemo;  
  2.   
  3. import com.example.galleryFlowdemo.DGalleryActivity;  
  4. import android.os.Bundle;  
  5. import android.app.Activity;  
  6. import android.content.Intent;  
  7. import android.content.res.TypedArray;  
  8. import android.view.Menu;  
  9. import android.view.View;  
  10. import android.widget.AdapterView;  
  11. import android.widget.AdapterView.OnItemClickListener;  
  12. import android.widget.Gallery;  
  13. import android.widget.ImageView;  
  14. import android.widget.Toast;  
  15.   
  16. public class AndroidGalleryDemo extends Activity {  
  17.   
  18.     private Intent intent;  
  19.     private Gallery gallery;  
  20.     private ImageView imageView;  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.activity_android_gallery_demo);  
  25.           
  26.         gallery=(Gallery) findViewById(R.id.gallery);  
  27.         TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);  //设置背景风格。Gallery背景风格定义在attrs.xml中    
  28.         MyImageAdapter adapter=new MyImageAdapter(this);  
  29.         adapter.setmGalleryItemBackground(typedArray.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0));  //设置gallery背景  
  30.         gallery.setAdapter(adapter);    
  31.         gallery.setOnItemClickListener(new OnItemClickListener() {  
  32.   
  33.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  34.                     long arg3) {  
  35.                 Toast.makeText(AndroidGalleryDemo.this, "" + arg2, Toast.LENGTH_SHORT).show();  
  36.                 switch(arg2){  
  37.                 case 0:  
  38.                     intent=new Intent(AndroidGalleryDemo.this,DGalleryActivity.class);  
  39.                     startActivity(intent);  
  40.                 }  
  41.             }  
  42.               
  43.         });  
  44.     }  
  45.   
  46.     @Override  
  47.     public boolean onCreateOptionsMenu(Menu menu) {  
  48.         getMenuInflater().inflate(R.menu.activity_android_gallery_demo, menu);  
  49.         return true;  
  50.     }  
  51. }  
  这里我们需要自己定义一个Adapter,继承自BaseAdapter,BaseAdapter是一个非常重要的类,大家一定要熟练掌握如何继承各种形式的BaseAdapter。代码如下:

  1. package com.example.androidgallerydemo;  
  2.   
  3. import android.content.Context;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6. import android.widget.BaseAdapter;  
  7. import android.widget.Gallery;  
  8. import android.widget.ImageView;  
  9.   
  10. /* 
  11.  *  MyImageAdapter 用来控制gallery的资源和操作. 
  12.  */  
  13. public class MyImageAdapter extends BaseAdapter {  
  14.   
  15.     private int mGalleryItemBackground;// 用来设置gallery的风格  
  16.       
  17.     public int getmGalleryItemBackground() {  
  18.         return mGalleryItemBackground;  
  19.     }  
  20.   
  21.     public void setmGalleryItemBackground(int mGalleryItemBackground) {  
  22.         this.mGalleryItemBackground = mGalleryItemBackground;  
  23.     }  
  24.   
  25.     private Context context;  
  26.     private Integer[] imageids={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d};//图片的资源ID,我们在gallery浏览的图片    
  27.       
  28.     public MyImageAdapter(Context context){//构造函数    
  29.         this.context=context;  
  30.     }  
  31.       
  32.     public int getCount() {//返回所有图片的个数            
  33.         return imageids.length;  
  34.     }  
  35.   
  36.     public Object getItem(int arg0) { //返回图片在资源的位置            
  37.         return arg0;  
  38.     }  
  39.   
  40.     public long getItemId(int position) {//返回图片在资源的位置         
  41.         return position;  
  42.     }  
  43.   
  44.     public View getView(int position, View convertView, ViewGroup parent) {  //此方法是最主要的,他设置好的ImageView对象返回给Gallery    
  45.         ImageView imageview = new ImageView(context);   
  46.         imageview.setImageResource(imageids[position]);  <span style="font-family: 'Microsoft YaHei'; font-size: 12px; background-color: rgb(247, 247, 247); ">//通过索引获得图片并设置给ImageView  </span>  
  47.         imageview.setScaleType(ImageView.ScaleType.FIT_XY); <span style="font-family: 'Microsoft YaHei'; font-size: 12px; background-color: rgb(247, 247, 247); ">//设置ImageView的伸缩规格,用了自带的属性值</span>  
  48.         imageview.setLayoutParams(new Gallery.LayoutParams(128, 128));<span style="font-family: 'Microsoft YaHei'; font-size: 12px; background-color: rgb(247, 247, 247); ">//设置布局参数  </span>  
  49.         imageview.setBackgroundResource(mGalleryItemBackground); //设置风格,此风格的配置是在xml中    
  50.         return imageview;  
  51.     }  
  52. }  
  还有就是背景的样式,在ImageAdapter类的构造方法中获得了Gallery组件的属性信息。这些信息被定义在res\values\attrs.xml文件中,代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <declare-styleable name="Gallery">  
  4.         <attr name="android:galleryItemBackground" />  
  5.     </declare-styleable>  
  6. </resources>  
它就是来产生那个方框的效果的, 这样就完成了最简单的gallery的使用,效果如下:

 

   二.循环Gallery

下面对这个例子做一下拓展,常规做法,Gallery组件只能有限地显示指定的图像。也就是说,如果为Gallery组件指定了4张图像,那么当Gallery组件显示到第4张时,就不会再继续显示了。这虽然在大多数时候没有什么关系,但在某些情况下,我们希望图像显示到最后一张时再重第1张开始显示,也就是循环显示。要实现这种风格的Gallery组件,就需要对Gallery的Adapter对象进行一番修改。本来想在Api提供的方法中寻找突破口,但是却未果,可能还是自己水平不行,所以只能借鉴一下网上的一个解决方法。

  在ImageAdapter类中有两个非常重要的方法:getCount和getView。其中getCount方法用于返回图像总数,要注意的是,这个总数不能大于图像的实际数(可以小于图像的实际数),否则会抛出越界异常。当Gallery组件要显示某一个图像时,就会调用getView方法,并将当前的图像索引(position参数)传入该方法。一般getView方法用于返回每一个显示图像的组件(ImageView对象)。从这一点可以看出,Gallery组件是即时显示图像的,而不是一下将所有的图像都显示出来。在getView方法中除了创建了ImageView对象,还用从resIds数组中获得了相应的图像资源ID来设置在ImageView中显示的图像。最后还设置了Gallery组件的背景显示风格。所以position的数值和getCount是对应的,比如我们这里是四个图片,那么position就是从0到3.如果我们想要实现循环那么当position的数值超过3时就应该让它变为0,解决方法就是取余,用position来除图片数组的长度,公式是:imageids=[position%imageids.length]。这样,当position超过3时,它的值是4,而图片数组长度也是4,求余就是0,这样gallery就会显示数组里第一个图片,同理当position为5,求余为1,显示第二个图片,以此类推。

   这样,只要在之前的MyImageAdapter修改一下即可,一个是getCount返回值为:

  1. public int getCount()  
  2.        {  
  3.            return Integer.MAX_VALUE;  
  4.        }  
    一个是设置图片显示资源为:  imageView.setImageResource(resIds[position  %  resIds.length]);

  当然,这种方法从本质上说只是伪循环,也就是说,如果真把图像移动到getCount方法返回的值那里,那也就显示到最后一个图像的。不过在这里getCount方法返回的是Integer.MAX_VALUE,这个值超过了20亿,除非有人真想把图像移动到第20亿的位置,否则Gallery组件看着就是一个循环显示图像的组件。 

   三.菜单Gallery

  而且,gallery有很多的方法供我们使用,比如选中一个项目,项目移动,keyDown,keyUp等等。在这里我们是展示了一系列图片,也可以用gallery来当TabWidget作为菜单项。

   这个比较简单了,在gallery的OnClickListener()方法里加载各个页面的布局文件就可以了。有人这么做来替换TabWidget,因为后者比较浪费资源,前者是只有在用时才会加载。

    四.Gallery3D效果

   先看一下效果图,


  那如何实现呢,这个就需要用到关于图像处理方面的类了。

  1.倒影效果的实现:

第一:利用Matrix矩阵来实现图片的旋转。

第二:利用旋转后的图片创建一个位图reflectionImage,宽度不变,高度是原始图片的一半(自己可以随意设置),就是效果图中倒影的大小

第三:创建一个能包含原始图片和倒影图片的位图finalReflection(宽度一样,高度是原始图片的高度加上倒影图片的高度)

第四:用刚创建的位图finalReflection创建一个画布

第五:把原始图片和倒影图片添加到画布上去

第六:创建线性渐变LinearGradient对象,实现倒影图片所在的区域是渐变效果


这个写在MyImageAdapter里面就可以了,代码如下:

  1. import android.content.res.Resources;  
  2. import android.graphics.Bitmap;  
  3. import android.graphics.BitmapFactory;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.LinearGradient;  
  6. import android.graphics.Matrix;  
  7. import android.graphics.Paint;  
  8. import android.graphics.PorterDuffXfermode;  
  9. import android.graphics.Bitmap.Config;  
  10. import android.graphics.PorterDuff.Mode;  
  11. import android.graphics.Shader.TileMode;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.widget.BaseAdapter;  
  15. import android.widget.ImageView;  
  16. import android.widget.ImageView.ScaleType;  
  17.   
  18. public class ImageAdapter extends BaseAdapter {  
  19.     int mGalleryItemBackground;  
  20.     private Context mContext;  
  21.     private Integer[] mImageIds;  
  22.     private ImageView[] mImages;  
  23.     public ImageAdapter(Context c, Integer[] ImageIds) {  
  24.         mContext = c;  
  25.         mImageIds = ImageIds;  
  26.         mImages = new ImageView[mImageIds.length];  
  27.     }  
  28.     public boolean createReflectedImages() {  
  29.         final int reflectionGap = 4;  
  30.         int index = 0;  
  31.         for (int imageId : mImageIds) {  
  32.             Bitmap originalImage = BitmapFactory.decodeResource(mContext  
  33.                     .getResources(), imageId);  
  34.             int width = originalImage.getWidth();  
  35.             int height = originalImage.getHeight();  
  36.             Matrix matrix = new Matrix();  
  37.             matrix.preScale(1, -1);  
  38.             Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,  
  39.                     height / 2, width, height / 2, matrix, false);  
  40.             Bitmap bitmapWithReflection = Bitmap.createBitmap(width,  
  41.                     (height + height / 2), Config.ARGB_8888);  
  42.   
  43.             Canvas canvas = new Canvas(bitmapWithReflection);  
  44.             canvas.drawBitmap(originalImage, 0, 0, null);  
  45.             Paint deafaultPaint = new Paint();  
  46.             canvas.drawRect(0, height, width, height + reflectionGap,  
  47.                     deafaultPaint);  
  48.   
  49.             canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);  
  50.             Paint paint = new Paint();  
  51.             LinearGradient shader = new LinearGradient(0, originalImage  
  52.                     .getHeight(), 0, bitmapWithReflection.getHeight()  
  53.                     + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);  
  54.   
  55.             paint.setShader(shader);  
  56.             paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));  
  57.             canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()  
  58.                     + reflectionGap, paint);  
  59.             ImageView imageView = new ImageView(mContext);  
  60.             imageView.setImageBitmap(bitmapWithReflection);  
  61.             imageView.setLayoutParams(new GalleryFlow.LayoutParams(180, 240));  
  62.             imageView.setScaleType(ScaleType.MATRIX);  
  63.             mImages[index++] = imageView;  
  64.         }  
  65.         return true;  
  66.     }  
  67.     private Resources getResources() {  
  68.         // TODO Auto-generated method stub  
  69.         return null;  
  70.     }  
  71.     public int getCount() {  
  72.         return mImageIds.length;  
  73.     }  
  74.     public Object getItem(int position) {  
  75.         return position;  
  76.     }  
  77.     public long getItemId(int position) {  
  78.         return position;  
  79.     }  
  80.     public View getView(int position, View convertView, ViewGroup parent) {  
  81.         return mImages[position];  
  82.     }  
  83.         public float getScale(boolean focused, int offset) {  
  84.         return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));  
  85.     }  
  86.   
  87. }  
这样就实现倒影效果了,那如何在gallery中显示呢,我们还需要重写Gallery,才会显示如上的效果,如果不重写而是直接运行的话不仅没有效果还会报错。重写的目的就是实现像上面那样,图片有间距等效果,代码如下:

  1. import android.content.Context;  
  2. import android.graphics.Camera;  
  3. import android.graphics.Matrix;  
  4. import android.util.AttributeSet;  
  5. import android.view.View;  
  6. import android.view.animation.Transformation;  
  7. import android.widget.Gallery;  
  8. import android.widget.ImageView;  
  9.   
  10. public class GalleryFlow extends Gallery {  
  11.   
  12.     private Camera mCamera = new Camera();  
  13.     private int mMaxRotationAngle = 60;  
  14.     private int mMaxZoom = -120;  
  15.     private int mCoveflowCenter;  
  16.     public GalleryFlow(Context context) {  
  17.             super(context);  
  18.             this.setStaticTransformationsEnabled(true);  
  19.     }  
  20.     public GalleryFlow(Context context, AttributeSet attrs) {  
  21.             super(context, attrs);  
  22.             this.setStaticTransformationsEnabled(true);  
  23.     }  
  24.     public GalleryFlow(Context context, AttributeSet attrs, int defStyle) {  
  25.             super(context, attrs, defStyle);  
  26.             this.setStaticTransformationsEnabled(true);  
  27.     }  
  28.     public int getMaxRotationAngle() {  
  29.             return mMaxRotationAngle;  
  30.     }  
  31.     public void setMaxRotationAngle(int maxRotationAngle) {  
  32.             mMaxRotationAngle = maxRotationAngle;  
  33.     }  
  34.     public int getMaxZoom() {  
  35.             return mMaxZoom;  
  36.     }  
  37.     public void setMaxZoom(int maxZoom) {  
  38.             mMaxZoom = maxZoom;  
  39.     }  
  40.     private int getCenterOfCoverflow() {  
  41.             return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2  
  42.                             + getPaddingLeft();  
  43.     }  
  44.     private static int getCenterOfView(View view) {  
  45.             return view.getLeft() + view.getWidth() / 2;  
  46.     }  
  47.     protected boolean getChildStaticTransformation(View child, Transformation t) {  
  48.             final int childCenter = getCenterOfView(child);  
  49.             final int childWidth = child.getWidth();  
  50.             int rotationAngle = 0;  
  51.             t.clear();  
  52.             t.setTransformationType(Transformation.TYPE_MATRIX);  
  53.             if (childCenter == mCoveflowCenter) {  
  54.                     transformImageBitmap((ImageView) child, t, 0);  
  55.             } else {  
  56.                     rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);  
  57.                     if (Math.abs(rotationAngle) > mMaxRotationAngle) {  
  58.                             rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle  
  59.                                             : mMaxRotationAngle;  
  60.                     }  
  61.                     transformImageBitmap((ImageView) child, t, rotationAngle);  
  62.             }  
  63.             return true;  
  64.     }  
  65.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
  66.             mCoveflowCenter = getCenterOfCoverflow();  
  67.             super.onSizeChanged(w, h, oldw, oldh);  
  68.     }  
  69.     private void transformImageBitmap(ImageView child, Transformation t,  
  70.                     int rotationAngle) {  
  71.             mCamera.save();  
  72.             final Matrix imageMatrix = t.getMatrix();  
  73.             final int imageHeight = child.getLayoutParams().height;  
  74.             final int imageWidth = child.getLayoutParams().width;  
  75.             final int rotation = Math.abs(rotationAngle);  
  76.             // 在Z轴上正向移动camera的视角,实际效果为放大图片。  
  77.             // 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。  
  78.             mCamera.translate(0.0f, 0.0f, 100.0f);  
  79.             // As the angle of the view gets less, zoom in  
  80.             if (rotation < mMaxRotationAngle) {  
  81.                     float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));  
  82.                     mCamera.translate(0.0f, 0.0f, zoomAmount);  
  83.             }  
  84.             // 在Y轴上旋转,对应图片竖向向里翻转。  
  85.             // 如果在X轴上旋转,则对应图片横向向里翻转。  
  86.             mCamera.rotateY(rotationAngle);  
  87.             mCamera.getMatrix(imageMatrix);  
  88.             imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));  
  89.             imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));  
  90.             mCamera.restore();  
  91.     }  
  92. }  

至此就完成了3D效果显示,其实Gallery还有很多其他的可以实现的效果。大家只要有想法就去实现吧!


来源:http://blog.youkuaiyun.com/wangjinyu501/article/details/8179206



用Google图片搜索反向挖掘数据科学学习资源 在数据科学学习中,技术图表(如算法流程图、模型结构图、公式推导图)是比文字更高效的知识载体,因其具备高信息密度、低语义歧义和强视觉锚定特性。Google图片搜索通过CNN提取图像的纹理、布局与关系特征,实现跨术语、跨语言、跨媒介的视觉语义检索,有效解决‘记不住准确关键词’‘搜不到原始出处’‘文字描述失真’等典型痛点。该能力本质是将非结构化视觉内容转化为可溯源、可验证、可复用的学习资产,广泛应用于新人自学、教学素材定位、技术文档审计及企业知识库构建。本文聚焦Google图片搜索在数据科学领域的反向检索原理与工 阅读详情

相关推荐

Web渗透测试实战指南:从信息收集到权限维持的完整知识库

Web渗透测试是网络安全领域的核心实践,旨在通过模拟攻击来评估Web应用的安全性。其原理在于系统性地探测目标应用的攻击面,识别潜在漏洞,并验证其可利用性。这项技术的价值在于帮助组织提前发现安全弱点,避免数据泄露、服务中断等风险,是构建主动防御体系的关键环节。典型应用场景包括企业安全自查、红蓝对抗演练、合规性审计等。本文聚焦于一个实战导向的Web渗透测试知识库,该库聚合了从信息收集、漏洞扫描到权限提升、横向移动乃至后渗透阶段的完整工具链与方法论,特别强调了针对SQL注入、XSS等常见漏洞的手动验证技巧,以及如

weixin_33691817的博客 520

【Android从零单排系列二十四】《Android视图控件——Gallery》

小伙伴们,在上文中我们介绍了Android视图组件PopupWindow,本文我们继续盘点,介绍一下视图控件的Gallery。注:Gallery在API29中已被弃用。<Gallery// 自定义适配器@Override@Override@Override@Override} else {@Override// 处理选中项的操作@Override// 处理没有选中项的操作});

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1372

端侧全栈离线AI:Gemma 4 31B手机本地部署实战指南

离线AI不是模型压缩的妥协方案,而是以端侧全栈部署实现数据主权与实时推理的技术范式。其核心在于将大语言模型(如Gemma 4 31B)完整量化后,在手机NPU上完成从token输入、KV缓存到文本生成的全链路闭环,无需联网、不传数据、不触DNS。这种物理隔离式AI显著提升隐私安全与响应确定性,广泛适用于法律审阅、医疗报告解析、工业设备日志处理及教育场景中的结构化笔记生成。结合端侧多模态理解(Ask Image)与本地RAG知识库(Wikipedia Agent),真正实现‘有网更强,无网照用’的生产力跃迁。

dianqi0560的博客 527

android gallery效果,Android开发实现Gallery画廊效果的方法

本文实例讲述了Android开发实现Gallery画廊效果的方法。分享给大家供大家参考,具体如下:画廊 使用Gallery表示,按水平方向显示内容,并且可以用手指直接拖动图片移动,一般用来浏览图片,被选中的选项位于中间,可以响应事件显示信息。xml布局文件基本语法属性列表/>Gallery支持4中xml属性属性名称描述android:animationDuration设置布局变化时动画的转换...

weixin_42369343的博客 2088

Android3D画廊Gallery实现无限循环和自动跳转

Android3D画廊Gallery实现无限循环、自动跳转、倒影效果,可根据不同情况自己设置图片间间距,从而改变整体间距样式。

【讯飞星火大模型AI】SpringBoot整合星火API:从零构建智能数据分析助手

本文详细介绍了如何使用SpringBoot框架整合讯飞星火大模型API,从零构建一个智能数据分析助手。通过清晰的步骤,指导开发者完成API密钥申请、项目搭建、SDK集成与核心代码编写,实现用户通过自然语言指令和CSV数据,即可自动获得ECharts图表代码与专业数据分析结论,极大降低数据分析与可视化的门槛。

neovim7hacker的博客 275

android 动态向Gallery中添加图片及倒影&&3D效果

在android中gallery可以提供一个很好的显示图片的方式,实现上面的效果以及动态添加数据库或者网络上下载下来的图片资源。我们首先实现一个自定义的Gallery类。 MyGallery.java 1 package nate.android.Service; 2 import android.content.Context; 3 import android.grap

chuchu521的专栏 1440

OnePlus线刷救砖与OTA全量包:从故障恢复到系统升级的完整指南

本文详细介绍了OnePlus手机线刷救砖与OTA全量包的完整操作指南,包括故障诊断、线刷救砖实战教程、OTA全量包升级优势及进阶玩法。通过具体案例和实用技巧,帮助用户从系统故障恢复到安全升级,特别适合Android系统爱好者和OnePlus用户。

weixin_30338481的博客 626

三星Gallery3d应用取证分析:挖掘删除痕迹的数字取证技术

所有这些研究导致对逆向工程Android应用、新的独特哈希码算法和不同编码技术的更深入理解。进一步研究可能/可能不被现有工具解析的应用数据库仍然可以带来新的信息、感兴趣的文件夹、日志文件等。您可能会发现Android或特定应用的新版本中引入的新数据。对于Mike的案例,使用本文的研究和脚本显示用户习惯于截屏或下载图像,然后在短时间内删除它们并清空垃圾箱。网络浏览器用于访问有问题的图像,但删除网络历史记录也是一个频繁的过程。恢复的截屏名称显示用户在特定时间使用了网络浏览器。

分享技术点滴 860

Spring AI 实战:5 分钟搭建你的第一个 AI 应用(含完整代码)

能力关键 API适用场景基础对话简单问答、文本生成流式输出实时打字机效果@Bean模型需要调用外部工具结构化输出需要返回 Java 对象多轮对话聊天机器人场景Spring AI 让 Java 开发者可以用最熟悉的方式(Spring Boot + Maven)进入 AI 应用开发领域,不用学新语言,不用换框架,这是它最大的优势。但目前为止,我们的 AI 应用只能回答"它脑子里已有的知识"。如果让它读懂你自己的技术文档、公司内部知识库呢?这就是下一篇文章的主题——RAG(检索增强生成)实战。

qq_17204557的博客 644

SOLIDWORKS转CAD字体终极选择:TrueType vs SHX,哪个才是你图纸协作的“安全牌”?

本文深入探讨SOLIDWORKS转CAD工程图中的字体选择问题,对比TrueType与SHX字体在DWG文件协作中的表现。通过真实案例揭示字体映射的兼容性陷阱,提供企业级字体管理方案,帮助工程师规避版本差异、系统依赖和法律风险,确保图纸协作的稳定性。

weixin_34233974的博客 265

GridView,AutoCompleteTextView,Spinner,Gallery,

GridViewGridView的的用法与ListView的用法基本相同,只是GridView可以多列显示。而ListView只能 一列显示。在XML的中设置列数: 例如:android:numColumns="3"其他的设置与ListView完全一样。AutoCompleteTextViewAutoCompleteTextView是用来搜索关键字的,例如在输入框中输入了La这两个字符,其下拉菜单

chenmeng911的博客 530

请叫我鱼拆,2024扫地机器人的第一次拆机

从背面可以看出,这个机器人是两轮差速模型,两个驱动轮,一个万向轮,驱动轮位于机器人中心位置,这样原地旋转的圆心就是机器人的中心。可以看到设备已经连接,但是没有办法进shell,厂家应该有做了安全保护之类的,有知道从这个口可以登录系统办法的小伙伴可以后台留言。但这台机器人一直报警说,机器人轮子离地,小鱼 估计是防跌落模块有问题,误触发了,所以打算先拆机看看。接着小鱼试了下,机器可以开机,然后给他重新配置wifi,连上 米家。Allwinner,全志的片子,不知道哪个型号的,看产品id,应该支持adb。

生活不止眼前的苟且 3932

Android 深入系统完全讲解(7)

系统在启动过程中解析 AndroidMainfest.xml,将应用的信息存储下来,随后根据用户的操作,或者系统的广播触发,启动对应的应用。我们在各个应用市场看到的,大多是第三方应用,也就是安装在 data 区域的应用,它们可以卸载,并且权限也受到一些限制,比如不能直接设置时间日期,需要调用到系统应用设置里面再进行操作。而此时我没有编译代码,也没有加载代码(用的官方的),就这么幸运的知道原来调试只依赖包和对应的进程,那时候开始系统代码学习就加速了,有了长足的进步,这也是我一般不写流程的原因。

程序员入门进阶 666

深度学习|卷积神经网络

介绍卷积神经网络基本理论,包括卷积层、池化层和全连接层,并阐述LeNet卷积神经网络的构建过程。

weixin_58243219的博客 5727

【图像去噪】论文复现:Mamba没Out!MaIR的Pytorch源码复现,跑通全流程,轻松解决环境配置问题,图文结合,明确MaIR创新点,与MambaIR对比,示意图与源码对应,清晰易懂,注释详细!

论文题目:MaIR: A Locality- and Continuity-Preserving Mamba for Image Restoration —— MaIR:用于图像恢复的局部性和连续性保持 Mamba【图像去噪】论文精读:MaIR: A Locality- and Continuity-Preserving Mamba for Image Restoration【图像去噪】论文复现:Man!

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1114

Android 自定义ListView + Gallery 组合,在ListView的一个item中显示多张图片

效果如图:  Item项包含标题、描述及一个Gallery.     主配置文件(main): [html] view plaincopy xml version="1.0" encoding="utf-8"?>   LinearLayout xmlns:android="http://schemas.android.com/

逍遥飞鹤的专栏 2979

手把手教你学Simulink--基于Simulink的开关磁阻电机电流斩波控制仿真建模

特点:定子和转子均由普通硅钢片叠压而成,没有永磁体或绕组在转子上。工作原理:利用转子旋转时不同位置的磁阻变化产生转矩。控制挑战:由于SRM的高度非线性和磁饱和效应,需要复杂的控制算法来优化性能。利用Simscape Electrical中的模块构建SRM的物理模型,配置参数如电阻、电感等。matlab深色版本% 添加SRM电机模块根据实际需求调整电机参数。通过上述步骤,我们简要介绍了如何基于Simulink进行开关磁阻电机的电流斩波控制仿真建模。

MHD0815的博客 306

android扫码功能集成

android集成扫码功能 1、zxing扫码集成 2、zbar扫码集成 3、华为官方提供的扫码集成(推荐使用) 上面的三种集成中,相信集成过的都知道 第一种zxing扫码集成,遇到多种机型和扫码识别成功率都有很多缺陷; 第二种扫码可以,但是相册扫码功能有待挖掘,不支持业务需要,但是相比较于第一种来说,识别的成功率要高出很多 而这里,我们在踩过上面的坑后,都要果断的抛弃他们,因为有更牛逼的更简单的操作集成来了,这里我们只介绍第三种,前二种大家可以百度看看 华为扫码功能集成介绍 整个项目的build.gra

Dota_wy的博客 910

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

今天我要跟你分享的是Framework的学习和调试的方法。首先,Android是一种基于Linux的开放源代码软件栈,为广泛的设备和机型而创建。下图是Android平台的...

singwhatiwanna 767

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

qt5.9.0调试如何查看变量的值_这些安卓源码调试技巧,不懂的程序员月薪绝对不过 30k...

今天我分享的是Framework的学习和调试的方法。首先,Android是一种基于Linux的开放源代码软件栈,为广泛的设备和机型而创建。下图是Android平台的主要组件。从图中你可以看到主要有以下几部分组成:Linux内核Android Runtime原生C/C++库Java API框架(后面我称之为Framework框架层)系统应用我们在各个应用市场看到的,大多是第三方应用,也就是安装在da...

weixin_39658474的博客 127

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Aves 完整指南:支持 360° 视频与元数据浏览的相册管理能力层全景拆解

Aves 是一款基于 Flutter 开发、面向 Android 的相册管理与媒体元数据浏览器应用。它要解决的核心问题不是简单的"看照片",而是把动态照片、全景照片、360° 视频这类特殊格式正确解码渲染出来,再把文件内部隐藏的 EXIF / XMP / GeoTIFF 信息挖掘成可筛选、可检索的结构化数据。它的全部能力都构建在本机媒体库之上,不依赖云端服务,能力边界清晰:一个本地化、可离线、深度

gitblog_00022的博客 455

[Android]Intent隐式启动Android系统程序的一些参数

CATEGORY_ALTERNATIVE 设置这个activity是否可以被认为是用户正在浏览的数据的一个可选择的action CATEGORY_APP_BROWSER 和ACTION_MAIN一起使用,用来启动浏览器应用程序 CATEGORY_APP_CALCULATOR 和ACTION_MAIN一起使用,用来启动计算器应用程序 CATEGORY_

努力奋斗 831

相册com.android,腾讯相册管家(com.tencent.gallerymanager) - 4.2.7 - 应用 - 酷安

权限信息· android.permission.USE_FINGERPRINT· 修改或删除您的USB存储设备中的内容· 读取您的USB存储设备中的内容· 读取手机状态和身份· 完全的网络访问权限· 查看网络连接· 查看WLAN连接· 访问USB存储设备的文件系统· 管理用户· 控制振动· 防止手机休眠· 修改系统设置· 在其他应用之上显示内容· 开机启动· android.permission...

weixin_36068199的博客 472

Adapter介绍

Adapter是将数据绑定到UI界面上的桥接类。Adapter负责创建显示每个项目的子View和提供对下层数据的访问。   支持Adapter绑定的UI控件必须扩展AdapterView抽象类。创建自己的继承自AdapterView的控件和创建新的Adapter类来绑定它们是可能的。   一些Android提供的Adapter介绍   在多数情况下,你不需要白手

142
上一篇: FAQ_22 Cursor 遍历数据库
下一篇: Android ViewPager使用详解
SpeedyCoder
博客等级 码龄14年 415粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值