热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

用自己写的ImageLoad实现照片墙

在上一篇中,我们自己尝试写了一个简单的但功能齐全的ImageLoad,现在我们来尝试着用自己写的ImageLoad写一个简单的照片墙,我们先看看效果图,兴奋一下先:图片的内容获取是通

在上一篇中,我们自己尝试写了一个简单的但功能齐全的ImageLoad,现在我们来尝试着用自己写的ImageLoad写一个简单的照片墙,我们先看看效果图,兴奋一下先:
, "http://img1.mm131.com/pic/2867/0.jpg", "http://img1.mm131.com/pic/2866/0.jpg", "http://img1.mm131.com/pic/2865/0.jpg", "http://img1.mm131.com/pic/2864/0.jpg", "http://img1.mm131.com/pic/2863/0.jpg", "http://img1.mm131.com/pic/2862/0.jpg", "http://img1.mm131.com/pic/2861/0.jpg", "http://img1.mm131.com/pic/2860/0.jpg", "http://img1.mm131.com/pic/2859/0.jpg", "http://img1.mm131.com/pic/2858/0.jpg", "http://img2.mm131.com:55888/pic/2857/0.jpg", "http://img2.mm131.com:55888/pic/2856/0.jpg", "http://img2.mm131.com:55888/pic/2855/0.jpg", "http://img2.mm131.com:55888/pic/2854/0.jpg", "http://img2.mm131.com:55888/pic/2853/0.jpg", "http://img2.mm131.com:55888/pic/2852/0.jpg", "http://img2.mm131.com:55888/pic/2851/0.jpg", "http://img2.mm131.com:55888/pic/2850/0.jpg", "http://img2.mm131.com:55888/pic/2849/0.jpg", "http://img1.mm131.com/pic/2846/0.jpg", "http://img1.mm131.com/pic/2844/0.jpg", "http://img1.mm131.com/pic/2843/0.jpg", "http://img1.mm131.com/pic/2842/0.jpg", "http://img1.mm131.com/pic/2841/0.jpg", "http://img1.mm131.com/pic/2840/0.jpg", "http://img1.mm131.com/pic/2839/0.jpg", "http://img1.mm131.com/pic/2838/0.jpg", "http://img1.mm131.com/pic/2835/0.jpg", "http://img1.mm131.com/pic/2834/0.jpg", "http://img1.mm131.com/pic/2833/0.jpg", "http://img1.mm131.com/pic/2832/0.jpg", "http://img1.mm131.com/pic/2830/0.jpg", "http://img1.mm131.com/pic/2829/0.jpg", "http://img1.mm131.com/pic/2828/0.jpg", "http://img1.mm131.com/pic/2827/0.jpg", "http://img1.mm131.com/pic/2826/0.jpg", "http://img1.mm131.com/pic/2825/0.jpg", "http://img1.mm131.com/pic/2824/0.jpg", "http://img1.mm131.com/pic/2823/0.jpg", "http://img1.mm131.com/pic/2821/0.jpg", "http://img1.mm131.com/pic/2820/0.jpg", "http://img1.mm131.com/pic/2819/0.jpg", "http://img1.mm131.com/pic/2818/0.jpg", "http://img1.mm131.com/pic/2816/0.jpg", "http://img1.mm131.com/pic/2815/0.jpg", "http://img1.mm131.com/pic/2814/0.jpg", "http://img1.mm131.com/pic/2812/0.jpg", "http://img1.mm131.com/pic/2811/0.jpg", "http://img1.mm131.com/pic/2810/0.jpg", "http://img1.mm131.com/pic/2809/0.jpg", "http://img1.mm131.com/pic/2808/0.jpg", "http://img1.mm131.com/pic/2806/0.jpg", "http://img1.mm131.com/pic/2805/0.jpg", "http://img1.mm131.com/pic/2804/0.jpg", "http://img1.mm131.com/pic/2803/0.jpg", "http://img1.mm131.com/pic/2802/0.jpg", "http://img1.mm131.com/pic/2801/0.jpg" }; ArrayListlist = new ArrayList<>(); for (String url : urlArrays) { list.add(url); } return list; } }

好的,内容有了,那么我们还需要显示的界面呀,界面也是很简单的,主体布局就是一个GridView:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.yixingu.myphotowall.MainActivity">

    <GridView  android:id="@+id/gridView" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:horizontalSpacing="5dp" android:verticalSpacing="5dp" android:listSelector="@android:color/transparent" android:numColumns="3" android:stretchMode="columnWidth">
    GridView>
LinearLayout>

还有item:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="vertical">

    <com.yixingu.myphotowall.ui.SquareImageView  android:id="@+id/image" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerCrop" android:src="@drawable/img"/>

LinearLayout>

其中SquareImageView是自己自定义的yigeImageView,主要是为了让图片成正方形:

package com.yixingu.myphotowall.ui;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;

/** * Created by likaisong on 17-4-1. */

public class SquareImageView extends ImageView {

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

    public SquareImageView(Context context, AttributeSet attrs){
        super(context,attrs);
    }

    public SquareImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }
}

主体布局有了,GridView有来,接着当然是Adapter啦,

package com.yixingu.myphotowall.adapter;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

import com.yixingu.myphotowall.R;
import com.yixingu.myphotowall.bean.ImageUrlList;
import com.yixingu.myphotowall.myInageLoader.MyImageLoader;
import com.yixingu.myphotowall.utils.MyUtils;

import java.util.ArrayList;

/** * Created by likaisong on 17-4-1. */

public class ImageAdapter extends BaseAdapter{

    ArrayList urls = ImageUrlList.urlList();
    private Context mContext;
    private MyImageLoader mImageLoader ;
    private boolean mCanGetBitmapFromNetWork = false;
    public static boolean mIsGridViewIdle = true;
    private int mImageWidth = 0;
    private Drawable mDefaultBitmapDrawable;
    private boolean isWifi = false;
    public ImageAdapter(Context context){
        mCOntext= context;
        mDefaultBitmapDrawable = context.getResources().getDrawable(R.drawable.img);
        mImageLoader = MyImageLoader.build(mContext);
        initData();
    }

    private void initData() {
        int screenWidth = MyUtils.getScreenMetrics(mContext).widthPixels;
        int space = (int)MyUtils.dp2px(mContext, 20f);
        mImageWidth = (screenWidth - space) / 3;
        isWifi = MyUtils.isWifi(mContext);
        //判断是不是wifi环境
        if(isWifi){
            mCanGetBitmapFromNetWork = true;
        }
        if(!isWifi){
            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
            builder.setMessage("初次加载需要5M流量,是否继续?");
            builder.setTitle("注意");
            builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    mCanGetBitmapFromNetWork = true;
                    notifyDataSetChanged();
                }
            });
            builder.setNegativeButton("否",null);
            builder.show();
        }
    }

    @Override
    public int getCount() {
        return urls.size();
    }

    @Override
    public String getItem(int i) {
        return urls.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View convertView, ViewGroup viewGroup) {
        ViewHolder holder = null;
        if(cOnvertView== null){
            cOnvertView= LayoutInflater.from(mContext).inflate(R.layout.gridview_item,viewGroup,false);
            holder = new ViewHolder();
            holder.imageView = (ImageView)convertView.findViewById(R.id.image);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        ImageView imageView = holder.imageView;
        final String tag = (String) imageView.getTag();
        final String url = getItem(i);
        if(!url.equals(tag)){
            imageView.setImageDrawable(mDefaultBitmapDrawable);
        }
        //如果列表静止以及可以连接网络状态时
        if(mIsGridViewIdle && mCanGetBitmapFromNetWork){
            imageView.setTag(url);
            //借助异步加载
            mImageLoader.bindBitmap(url,imageView,mImageWidth,mImageWidth);
        }
        return convertView;
    }

    static class ViewHolder{
        ImageView imageView;
    }
}

最后在MainActivity中用就行来,

package com.yixingu.myphotowall;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.AbsListView;
import android.widget.GridView;

import com.yixingu.myphotowall.adapter.ImageAdapter;

public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener{

    private GridView gridView;
    private ImageAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        gridView = (GridView)findViewById(R.id.gridView);
        adapter = new ImageAdapter(this);
        gridView.setAdapter(adapter);
        gridView.setOnScrollListener(this);
    }


    @Override
    public void onScrollStateChanged(AbsListView absListView, int scrollState) {
        if(scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE){
        //静态时才加载,滑动不加载
            ImageAdapter.mIsGridViewIdle = true;
            adapter.notifyDataSetChanged();
        }else{
            ImageAdapter.mIsGridViewIdle = false;
        }
    }

    @Override
    public void onScroll(AbsListView absListView, int i, int i1, int i2) {

    }

}

此外,还可以通过硬件加速解决偶尔卡顿现象:android:hardwareAccelerated=”true”.


推荐阅读
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文讨论了当某位排位靠前的涉众提供了一张精美的界面图片时,是否可以将其作为设计约束。同时还探讨了高质量素材和愿景之间的关系,以及老大自身的软件方法和建模技能。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • 本文研究了使用条件对抗网络进行图片到图片翻译的方法,并提出了一种通用的解决方案。通过学习输入图像到输出图像的映射和训练相应的损失函数,我们可以解决需要不同损失函数公式的问题。实验证明该方法在合成图片、重构目标和给图片着色等多个问题上都很有效。这项工作的重要发现是不再需要人为构建映射函数和损失函数,同时能够得出合理的结果。本文的研究对于图片处理、计算机图片合成和计算机视觉等领域具有重要意义。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 计算成像的原理与应用研究
    本文探讨了计算成像的原理与应用研究。首先介绍了小孔成像实验和软件方面的相关内容。随后从傅里叶光学的角度简单谈了成像的过程。成像是观测样品分布的一种方法,通过成像系统接收光的强度来呈现图像。视网膜作为接收端接收到的图像实际上是由像元组成的矩阵,每个元素代表相应位置像元接收光的强度。大脑通过对图像的分析,得出一系列信息,如识别物体、判断距离等。计算成像是一种采集记录系统,通过处理数据得到样品分布与像的对应关系,用于后续问题的分析。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 图片复制到服务器 方向变了_双服务器热备更新配置文件步骤问题及解决方法
    本文介绍了在将图片复制到服务器并进行方向变换的过程中,双服务器热备更新配置文件所出现的问题及解决方法。通过停止所有服务、更新配置、重启服务等操作,可以避免数据中断和操作不规范导致的问题。同时还提到了注意事项,如Avimet版本的差异以及配置文件和批处理文件的存放路径等。通过严格执行切换步骤,可以成功进行更新操作。 ... [详细]
  • 1.RoIPoolingRoIPooling顾名思义对Roi进行Pooling操作,主要用于目标检测任务。RoI(Regionofinterest&# ... [详细]
author-avatar
邪冫主_70139
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有