经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android实现微信朋友圈图片和视频播放
来源:jb51  时间:2021/5/10 8:45:55  对本文有异议

本文实例为大家分享了Android实现微信朋友圈图片和视频播放的具体代码,供大家参考,具体内容如下

1.效果图:

2.源码地址:链接

3.参数控制,是否显示播放按钮

  1. holder.layout.setIsShowAll(mList.get(position).isShowAll);
  2. holder.layout.setIsVideo(true); //true :video, false :img
  3. holder.layout.setUrlList(mList.get(position).urlList);

4.自定义控件:

  1. package com.example.mepositry.view;
  2. import android.content.Context;
  3. import android.content.res.TypedArray;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Paint;
  9. import android.graphics.PorterDuff;
  10. import android.graphics.Rect;
  11. import android.graphics.RectF;
  12. import android.graphics.drawable.Drawable;
  13. import android.support.v7.widget.AppCompatImageView;
  14. import android.util.AttributeSet;
  15. import android.view.MotionEvent;
  16. import android.view.ViewGroup;
  17. import com.example.mepositry.R;
  18. //根据宽高比例自动计算高度ImageView
  19. public class RatioImageView extends AppCompatImageView {
  20. private int playBtnRes = R.mipmap.play_btn_video;
  21. private Bitmap playBtnBitmap;
  22. private boolean type; //true表示video
  23. private int i; //i图片id
  24. private String url; //url图片地址
  25. private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
  26. Rect src = new Rect();
  27. RectF dest = new RectF();
  28. //* 宽高比例
  29. private float mRatio = 0f;
  30. public RatioImageView(Context context, AttributeSet attrs, int defStyleAttr) {
  31. super(context, attrs, defStyleAttr);
  32. }
  33. public RatioImageView(Context context, AttributeSet attrs) {
  34. super(context, attrs);
  35. /* TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatioImageView);
  36. playBtnRes = typedArray.getResourceId(R.styleable.ImageViewPlay_ivp_play_btn_res, playBtnRes);
  37. playBtnBitmap = BitmapFactory.decodeResource(getResources(), playBtnRes);
  38. mRatio = typedArray.getFloat(R.styleable.RatioImageView_ratio, 0f);
  39. typedArray.recycle();*/
  40. }
  41. public RatioImageView(Context context) {
  42. super(context);
  43. TypedArray typedArray = context.obtainStyledAttributes(R.styleable.RatioImageView);
  44. playBtnRes = typedArray.getResourceId(R.styleable.ImageViewPlay_ivp_play_btn_res, playBtnRes);
  45. playBtnBitmap = BitmapFactory.decodeResource(getResources(), playBtnRes);
  46. mRatio = typedArray.getFloat(R.styleable.RatioImageView_ratio, 0f);
  47. typedArray.recycle();
  48. }
  49. //*description: 设置图片类型,如果是TYPE_IMAGE,显示图片,如果是TYPE_VIDEO,显示图片,并且在图片正中心绘制一个播放按钮
  50. public void setType(boolean type, int i, String url){
  51. this.type = type;
  52. this.i = i;
  53. this.url = url;
  54. }
  55. //设置ImageView的宽高比
  56. public void setRatio(float ratio) {
  57. mRatio = ratio;
  58. }
  59. @Override
  60. protected void onDraw(Canvas canvas) {
  61. super.onDraw(canvas);
  62. if(type){
  63. //如果是true,显示图片,并且在图片正中心绘制一个播放按钮
  64. Drawable drawable = getDrawable();
  65. if (drawable != null) {
  66. int viewW = drawable.getIntrinsicWidth(); //获取图片的宽
  67. int viewH = drawable.getIntrinsicHeight(); //获取图片的高
  68. int btnW = playBtnBitmap.getWidth(); //获取播放按钮的宽
  69. int btnH = playBtnBitmap.getHeight(); //获取播放按钮的高
  70. float[] result = measureViewSize(viewW, viewH);
  71. if(result[0] > 0 && result[1] > 0){ //先根据比例缩放图标,确保绘制的时候再次回归缩放,保持播放的图片大小不变
  72. btnW *= (viewW / result[0]);
  73. btnH *= (viewH / result[1]);
  74. }
  75. float left = (viewW - btnW) / 2.0f;
  76. float top = (viewH - btnH) / 2.0f;
  77. src.set(0, 0, btnW, btnH);
  78. dest.set(left, top, left+btnW, top+btnH);
  79. canvas.save();
  80. canvas.concat(getImageMatrix());
  81. canvas.drawBitmap(playBtnBitmap, src, dest, mPaint);
  82. canvas.restore();
  83. }
  84. }
  85. }
  86. @Override
  87. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  88. int width = MeasureSpec.getSize(widthMeasureSpec);
  89. Drawable drawable = getDrawable();
  90. if (drawable != null) { //重新计算view
  91. int viewW = drawable.getIntrinsicWidth();
  92. int viewH = drawable.getIntrinsicHeight();
  93. if(viewW > 0 && viewH > 0) {
  94. float[] result = measureViewSize(viewW, viewH);
  95. setMeasuredDimension((int)result[0], (int) result[1]);
  96. }
  97. }
  98. if (mRatio != 0) {
  99. float height = width / mRatio;
  100. heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) height, MeasureSpec.EXACTLY);
  101. }
  102. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  103. }
  104. @Override
  105. public boolean onTouchEvent(MotionEvent event) {
  106. switch (event.getAction()) {
  107. case MotionEvent.ACTION_DOWN:
  108. Drawable drawable = getDrawable();
  109. if (drawable != null) {
  110. drawable.mutate().setColorFilter(Color.GRAY,
  111. PorterDuff.Mode.MULTIPLY);
  112. }
  113. break;
  114. case MotionEvent.ACTION_MOVE:
  115. break;
  116. case MotionEvent.ACTION_CANCEL:
  117. case MotionEvent.ACTION_UP:
  118. Drawable drawableUp = getDrawable();
  119. if (drawableUp != null) {
  120. drawableUp.mutate().clearColorFilter();
  121. }
  122. break;
  123. }
  124. return super.onTouchEvent(event);
  125. }
  126. // *description: 根据传入的图片宽高,计算出最终的imageview的宽高,长宽等比缩放
  127. private float[] measureViewSize(int w, int h) {
  128. ViewGroup.LayoutParams lp = getLayoutParams();
  129. float maxW = lp.width;
  130. float maxH = lp.height;
  131. float showWidth = w;
  132. float showHeight = h;
  133. float scale = (1.0f * maxW) / maxH;
  134. float s = 1.0f * w / h;
  135. if (w < maxW && h < maxH) { //不进行缩放
  136. showWidth = w;
  137. showHeight = h;
  138. } else if (s > scale) { //宽取最大,高进行缩小
  139. showWidth = maxW;
  140. showHeight = (int) (h * (showWidth * 1.0 / w));
  141. } else if (s <= scale) {//高取最大,宽进行缩小
  142. showHeight = maxH;
  143. showWidth = (int) (w * (showHeight * 1.0 / h));
  144. }
  145. float[] result = new float[2];
  146. result[0] = showWidth;
  147. result[1] = showHeight;
  148. return result;
  149. }
  150. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号