Android 自定义smartImageView

王辉
2023-12-01
public class MySmartImageView extends android.support.v7.widget.AppCompatImageView{  //既然要自定义ImageView 自然要继承ImageView

    private Handler handler = new Handler(){
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1://代表请求成功
                    Bitmap bitmap = (Bitmap) msg.obj;
                    //显示数据
                    MySmartImageView.this.setImageBitmap(bitmap);
                    break;
                case 2://请求失败 显示一个默认图片
                    int resource = (int) msg.obj;
                    MySmartImageView.this.setBackgroundResource(resource);
                    break;
                case 3:
                    int resource1 = (int) msg.obj;
                    MySmartImageView.this.setBackgroundResource(resource1);
                    break;
                default:
                    break;
            }
        }
    };





    //一个参数的构造方法 在new 代码初始化的时候调用
    public MySmartImageView(Context context) {
        super(context);
    }

    //这个类 在布局文件中使用的时候 调用2个参数构造方法
    public MySmartImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    // 显示图片的方法 path 是传过来的url地址
    public void setImageUrl(final String path, final int resource) {
        new Thread() {
            public void run() {
                try {
                    //2.2 创建URL 对象指定我们要访问的网址(路径)
                    URL url = new URL(path);
                    //2.3 拿到httpurlconnection对象 用于发送或者接收数据
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    //2.4 设置发送get请求
                    conn.setRequestMethod("GET");
                    //2.5 设置请求超时时间
                    conn.setConnectTimeout(5000);
                    //2.6 获取服务器返回的状态码
                    int code = conn.getResponseCode();
                    //2.7 如果code == 200 说明请求成功
                    if (code == 200) {
                        //2.8 获取服务器返回的数据 是以流的形式返回的,由于把流转换成字符串是一个非常常见的操作
                        //所以我抽出一个工具类utils
                        InputStream in = conn.getInputStream();
                        Bitmap bitmap = BitmapFactory.decodeStream(in);
                        //创建message对象
                        Message msg = Message.obtain();
                        msg.what =1;
                        msg.obj = bitmap;
                        handler.sendMessage(msg); // 发送消息
                    } else {
                        //请求失败
                        Message msg = Message.obtain();
                        msg.what = 2;
                        msg.obj = resource;
                        handler.sendMessage(msg); // 发送消息
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    Message msg = Message.obtain();
                    msg.what = 3;
                    msg.obj = resource;
                    handler.sendMessage(msg); // 发送消息
                }
            }
        }.start();
    }
}


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MySmartImageView iv = (MySmartImageView) findViewById(R.id.iv);
        iv.setImageUrl("https://www.baidu.com/img/270_36f64e1b77eb344d543d6e20029dbb92.png", R.mipmap.ic_launcher);
    }
}

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.a34_custom_smartimageview.MainActivity">

    <com.example.a34_custom_smartimageview.MySmartImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         />

</RelativeLayout>







 类似资料: