@Test public void testMockBuilderOfDrawableHierarchies() { GenericDraweeHierarchy gdh = DraweeMocks.mockDraweeHierarchy(); GenericDraweeHierarchyBuilder builder = DraweeMocks.mockBuilderOf(gdh); assertEquals(gdh, builder.build()); assertEquals(gdh, builder.build()); assertEquals(gdh, builder.build()); assertEquals(gdh, builder.build()); assertEquals(gdh, builder.build()); GenericDraweeHierarchy gdh1 = DraweeMocks.mockDraweeHierarchy(); GenericDraweeHierarchy gdh2 = DraweeMocks.mockDraweeHierarchy(); GenericDraweeHierarchy gdh3 = DraweeMocks.mockDraweeHierarchy(); GenericDraweeHierarchyBuilder multiBuilder = DraweeMocks.mockBuilderOf(gdh1, gdh2, gdh3); assertEquals(gdh1, multiBuilder.build()); assertEquals(gdh2, multiBuilder.build()); assertEquals(gdh3, multiBuilder.build()); assertEquals(gdh3, multiBuilder.build()); assertEquals(gdh3, multiBuilder.build()); }
private void changeDraweeViewScaleType( SimpleDraweeView draweeView, ScaleType scaleType, @Nullable PointF focusPoint) { final GenericDraweeHierarchy hierarchy = draweeView.getHierarchy(); hierarchy.setActualImageScaleType(scaleType); hierarchy.setActualImageFocusPoint(focusPoint != null ? focusPoint : new PointF(0.5f, 0.5f)); final RoundingParams roundingParams = Preconditions.checkNotNull(hierarchy.getRoundingParams()); if (BITMAP_ONLY_SCALETYPES.contains(scaleType)) { roundingParams.setRoundingMethod(RoundingParams.RoundingMethod.BITMAP_ONLY); } else { roundingParams.setOverlayColor(mWindowBackgroundColor); } hierarchy.setRoundingParams(roundingParams); }
private void displayImage(SimpleDraweeView draweeView, String url) { GenericDraweeHierarchy hierarchy = draweeView.getHierarchy(); //设置占位图 if (hierarchy == null) { hierarchy = GenericDraweeHierarchyBuilder.newInstance(getResources()) .setPlaceholderImage(getResources().getDrawable(R.mipmap.ic_launcher) , ScalingUtils.ScaleType.CENTER).build(); draweeView.setHierarchy(hierarchy); } else { hierarchy.setPlaceholderImage(getResources().getDrawable(R.mipmap.ic_launcher) , ScalingUtils.ScaleType.CENTER); } //构建ImageRequestBuilder,传入请求Uri ImageRequestBuilder requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url)); //构建Controller DraweeController controller = Fresco.newDraweeControllerBuilder() .setOldController(draweeView.getController()) .setImageRequest(requestBuilder.build()) .build(); //设置图片,Fresco设置显示图片都是通过Controller来实现 draweeView.setController(controller); }
private ViewGroup generateImageLayout() { SquareDraweeView imageView = new SquareDraweeView(mContext); GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(mContext.getResources()); GenericDraweeHierarchy hierarchy = builder .setFadeDuration(300).setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP) .build(); if (mPlaceholderImageResId > 0) { hierarchy.setPlaceholderImage(mPlaceholderImageResId); } if (mFailureImageResId > 0) { hierarchy.setFailureImage(mFailureImageResId); } imageView.setHierarchy(hierarchy); RelativeLayout.LayoutParams imgLp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); imgLp.setMargins(mImageBorderThickness, mImageBorderThickness, mImageBorderThickness, mImageBorderThickness); RelativeLayout mainLayout = new RelativeLayout(mContext); mainLayout.setBackgroundColor(mImageBorderColor); mainLayout.addView(imageView, imgLp); return mainLayout; }
public Attacher(DraweeView<GenericDraweeHierarchy> draweeView) { mDraweeView = new WeakReference<>(draweeView); draweeView.getHierarchy().setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER); draweeView.setOnTouchListener(this); mScaleDragDetector = new ScaleDragDetector(draweeView.getContext(), this); mGestureDetector = new GestureDetectorCompat(draweeView.getContext(), new GestureDetector.SimpleOnGestureListener() { @Override public void onLongPress(MotionEvent e) { super.onLongPress(e); if (null != mLongClickListener) { mLongClickListener.onLongClick(getDraweeView()); } } }); mGestureDetector.setOnDoubleTapListener(new DefaultOnDoubleTapListener(this)); }
@Override public void run() { DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView == null) { return; } float t = interpolate(); float scale = mZoomStart + t * (mZoomEnd - mZoomStart); float deltaScale = scale / getScale(); onScale(deltaScale, mFocalX, mFocalY); if (t < 1f) { postOnAnimation(draweeView, this); } }
@Override public void run() { if (mScroller.isFinished()) { return; } DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView != null && mScroller.computeScrollOffset()) { final int newX = mScroller.getCurrX(); final int newY = mScroller.getCurrY(); mMatrix.postTranslate(mCurrentX - newX, mCurrentY - newY); draweeView.invalidate(); mCurrentX = newX; mCurrentY = newY; postOnAnimation(draweeView, this); } }
private SimpleDraweeView createSimpleDraweeView() { SimpleDraweeView view = new SimpleDraweeView(itemView.getContext()); GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(itemView.getContext().getResources()); GenericDraweeHierarchy hierarchy = builder .setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP) .setPlaceholderImage(R.color.loading_color) .setPlaceholderImageScaleType(ScalingUtils.ScaleType.FIT_CENTER) .setFailureImage(R.mipmap.ic_failed) .setFailureImageScaleType(ScalingUtils.ScaleType.CENTER) .build(); view.setHierarchy(hierarchy); view.setTag(atomicInteger.getAndIncrement()); view.setOnClickListener(this); return view; }
public static void loadHeadView(Context context, SimpleDraweeView simpleDraweeView, Uri httpUri) { //初始化圆角圆形参数对象 RoundingParams rp = new RoundingParams(); //设置图像是否为圆形 rp.setRoundAsCircle(true); final GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(context.getResources()) .setRoundingParams(rp) .build(); DraweeController controller = Fresco.newDraweeControllerBuilder() .setUri(httpUri) .setTapToRetryEnabled(true) .setOldController(simpleDraweeView.getController()) .build(); simpleDraweeView.setHierarchy(hierarchy); simpleDraweeView.setController(controller); }
@Override public void onDrag(float dx, float dy) { DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView != null && !mScaleDragDetector.isScaling()) { mMatrix.postTranslate(dx, dy); checkMatrixAndInvalidate(); ViewParent parent = draweeView.getParent(); if (parent == null) { return; } if (mAllowParentInterceptOnEdge && !mScaleDragDetector.isScaling() && !mBlockParentIntercept) { if (mScrollEdge == EDGE_BOTH || (mScrollEdge == EDGE_LEFT && dx >= 1f) || ( mScrollEdge == EDGE_RIGHT && dx <= -1f)) { parent.requestDisallowInterceptTouchEvent(false); } } else { parent.requestDisallowInterceptTouchEvent(true); } } }
protected void init() { if (null == mAttacher || null == mAttacher.getImageView()) { mAttacher = new PhotoViewAttacher(this); } if (null != mPendingScaleType) { setScaleType(mPendingScaleType); mPendingScaleType = null; } if (mDraweeHolder == null) { GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources()) .setFadeDuration(500) .setProgressBarImage(new CustomProgressbarDrawable(this)) .build(); mDraweeHolder = DraweeHolder.create(hierarchy, getContext()); } }
public static GenericDraweeHierarchy getGenericDraweeHierarchy(Context context){ GenericDraweeHierarchy gdh = new GenericDraweeHierarchyBuilder(context.getResources()) // .reset()//重置 // .setActualImageColorFilter(colorFilter)//颜色过滤 // .setActualImageFocusPoint(focusPoint)//focusCrop, 需要指定一个居中点 // .setActualImageMatrix(actualImageMatrix) // .setActualImageScaleType(actualImageScaleType)//fresco:actualImageScaleType="focusCrop"缩放类型 // .setBackground(background)//fresco:backgroundImage="@color/blue"背景图片 // .setBackgrounds(backgrounds) // .setFadeDuration(fadeDuration)//fresco:fadeDuration="300"加载图片动画时间 .setFailureImage(ConfigConstants.sErrorDrawable)//fresco:failureImage="@drawable/error"失败图 // .setFailureImage(failureDrawable, failureImageScaleType)//fresco:failureImageScaleType="centerInside"失败图缩放类型 // .setOverlay(overlay)//fresco:overlayImage="@drawable/watermark"叠加图 // .setOverlays(overlays) .setPlaceholderImage(ConfigConstants.sPlaceholderDrawable)//fresco:placeholderImage="@color/wait_color"占位图 // .setPlaceholderImage(placeholderDrawable, placeholderImageScaleType)//fresco:placeholderImageScaleType="fitCenter"占位图缩放类型 // .setPressedStateOverlay(drawable)//fresco:pressedStateOverlayImage="@color/red"按压状态下的叠加图 .setProgressBarImage(new ProgressBarDrawable())//进度条fresco:progressBarImage="@drawable/progress_bar"进度条 // .setProgressBarImage(progressBarImage, progressBarImageScaleType)//fresco:progressBarImageScaleType="centerInside"进度条类型 // .setRetryImage(retryDrawable)//fresco:retryImage="@drawable/retrying"点击重新加载 // .setRetryImage(retryDrawable, retryImageScaleType)//fresco:retryImageScaleType="centerCrop"点击重新加载缩放类型 .setRoundingParams(RoundingParams.asCircle())//圆形/圆角fresco:roundAsCircle="true"圆形 .build(); return gdh; }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_image); final SimpleDraweeView mImageView = (SimpleDraweeView) findViewById(R.id.view_image_image); final int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); final GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources()) .setFadeDuration(shortAnimTime) .setProgressBarImage(new ImageLoadingDrawable(getResources())) .setFailureImage(getResources().getDrawable(R.drawable.ic_upload_failed), ScalingUtils.ScaleType.CENTER_INSIDE) .setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER) .build(); mImageView.setHierarchy(hierarchy); mImageView.setImageURI(getIntent().getParcelableExtra(EXTRA_IMAGE_URI)); }
/** * Creates a mock GenericDraweeHierarchyBuilder with stubbed build. * @param drawableHierarchies drawable hierarchies to return on {@code build()} * @return mock GenericDraweeHierarchyBuilder */ public static GenericDraweeHierarchyBuilder mockBuilderOf( GenericDraweeHierarchy... drawableHierarchies) { GenericDraweeHierarchyBuilder builder = mock(GenericDraweeHierarchyBuilder.class, CALLS_REAL_METHODS); final Supplier<GenericDraweeHierarchy> gdhProvider = supplierOf(drawableHierarchies); doAnswer( new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return gdhProvider.get(); } }).when(builder).build(); return builder; }
@Override public VolleyDraweeHolder onCreateViewHolder(ViewGroup parent, int viewType) { GenericDraweeHierarchy gdh = new GenericDraweeHierarchyBuilder(getContext().getResources()) .setPlaceholderImage(Drawables.sPlaceholderDrawable) .setFailureImage(Drawables.sErrorDrawable) .build(); InstrumentedDraweeView view = new InstrumentedDraweeView(getContext()); view.setHierarchy(gdh); return new VolleyDraweeHolder(getContext(), parent, view, getPerfListener()); }
@Override public FrescoHolder onCreateViewHolder(ViewGroup parent, int viewType) { GenericDraweeHierarchy gdh = new GenericDraweeHierarchyBuilder(getContext().getResources()) .setPlaceholderImage(Drawables.sPlaceholderDrawable) .setFailureImage(Drawables.sErrorDrawable) .setProgressBarImage(new ProgressBarDrawable()) .setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER) .build(); final InstrumentedDraweeView instrView = new InstrumentedDraweeView(getContext(), gdh); return new FrescoHolder(getContext(), parent, instrView, getPerfListener()); }
@Override public DraweeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { GenericDraweeHierarchy gdh = DraweeUtil.createDraweeHierarchy(mContext, mConfig); final InstrumentedDraweeView simpleDraweeView = new InstrumentedDraweeView(mContext, gdh, mConfig); simpleDraweeView.setPadding(mPaddingPx, mPaddingPx, mPaddingPx, mPaddingPx); return new DraweeViewHolder(parent, simpleDraweeView, mConfig, mPerfListener); }
@Override public View getView(int position, View convertView, ViewGroup parent) { InstrumentedDraweeView draweeView; if (convertView == null) { final Context context = parent.getContext(); GenericDraweeHierarchy gdh = DraweeUtil.createDraweeHierarchy(context, mConfig); draweeView = new InstrumentedDraweeView(context, gdh, mConfig); SizeUtil.setConfiguredSize(parent, draweeView, mConfig); draweeView.setPadding(mPaddingPx, mPaddingPx, mPaddingPx, mPaddingPx); } else { draweeView = (InstrumentedDraweeView) convertView; } final Uri uri = getItem(position); draweeView.initInstrumentation(uri.toString(), mPerfListener); ImageRequestBuilder imageRequestBuilder = ImageRequestBuilder .newBuilderWithSource(uri) .setResizeOptions( new ResizeOptions( draweeView.getLayoutParams().width, draweeView.getLayoutParams().height)); PipelineUtil.addOptionalFeatures(imageRequestBuilder, mConfig); // Create the Builder PipelineDraweeControllerBuilder builder = Fresco.newDraweeControllerBuilder() .setImageRequest(imageRequestBuilder.build()); if (mConfig.reuseOldController) { builder.setOldController(draweeView.getController()); } if (mConfig.instrumentationEnabled) { draweeView.setListener(builder); } draweeView.setController(builder.build()); return draweeView; }
/** * Creates the Hierarchy using the information into the Config * * @param context The Context * @param config The Config object * @return The Hierarchy to use */ public static GenericDraweeHierarchy createDraweeHierarchy( final Context context, final Config config) { GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(context.getResources()) .setFadeDuration(config.fadeDurationMs) .setPlaceholderImage(Const.PLACEHOLDER) .setFailureImage(Const.FAILURE) .setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER); applyScaleType(builder, config); if (config.useRoundedCorners || config.drawBorder) { final Resources res = context.getResources(); final RoundingParams roundingParams = new RoundingParams(); if (config.useRoundedCorners) { roundingParams.setRoundingMethod(RoundingParams.RoundingMethod.BITMAP_ONLY); roundingParams.setCornersRadius(res.getDimensionPixelSize(R.dimen.drawee_corner_radius)); roundingParams.setRoundAsCircle(config.useRoundedAsCircle); } if (config.drawBorder) { //noinspection deprecation roundingParams.setBorderColor(res.getColor(R.color.colorPrimary)); roundingParams.setBorderWidth(res.getDimensionPixelSize(R.dimen.drawee_border_width)); } builder.setRoundingParams(roundingParams); } return builder.build(); }
/** * 使用代码设置为圆圈形状 */ private void initCircleImage() { GenericDraweeHierarchy hierarchy = getHierarchy(); if(hierarchy != null){ hierarchy.setRoundingParams(new RoundingParams().setRoundAsCircle(true)); setHierarchy(hierarchy); } }
@Override public boolean onSingleTapConfirmed(MotionEvent e) { if (mAttacher == null) { return false; } DraweeView<GenericDraweeHierarchy> draweeView = mAttacher.getDraweeView(); if (draweeView == null) { return false; } if (mAttacher.getOnPhotoTapListener() != null) { final RectF displayRect = mAttacher.getDisplayRect(); if (null != displayRect) { final float x = e.getX(), y = e.getY(); if (displayRect.contains(x, y)) { float xResult = (x - displayRect.left) / displayRect.width(); float yResult = (y - displayRect.top) / displayRect.height(); mAttacher.getOnPhotoTapListener().onPhotoTap(draweeView, xResult, yResult); return true; } } } if (mAttacher.getOnViewTapListener() != null) { mAttacher.getOnViewTapListener().onViewTap(draweeView, e.getX(), e.getY()); return true; } return false; }
@Override public void setScale(float scale, float focalX, float focalY, boolean animate) { DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView == null || scale < mMinScale || scale > mMaxScale) { return; } if (animate) { draweeView.post(new AnimatedZoomRunnable(getScale(), scale, focalX, focalY)); } else { mMatrix.setScale(scale, scale, focalX, focalY); checkMatrixAndInvalidate(); } }
private int getViewHeight() { DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView != null) { return draweeView.getHeight() - draweeView.getPaddingTop() - draweeView.getPaddingBottom(); } return 0; }
public void checkMatrixAndInvalidate() { DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView == null) { return; } if (checkMatrixBounds()) { draweeView.invalidate(); } }
private RectF getDisplayRect(Matrix matrix) { DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView == null || (mImageInfoWidth == -1 && mImageInfoHeight == -1)) { return null; } mDisplayRect.set(0.0F, 0.0F, mImageInfoWidth, mImageInfoHeight); draweeView.getHierarchy().getActualImageBounds(mDisplayRect); matrix.mapRect(mDisplayRect); return mDisplayRect; }
private void resetMatrix() { mMatrix.reset(); checkMatrixBounds(); DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView != null) { draweeView.invalidate(); } }
private void checkMinScale() { DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView == null) { return; } if (getScale() < mMinScale) { RectF rect = getDisplayRect(); if (null != rect) { draweeView.post(new AnimatedZoomRunnable(getScale(), mMinScale, rect.centerX(), rect.centerY())); } } }
@Override public void onDrag(float dx, float dy) { DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView != null && !mScaleDragDetector.isScaling()) { mMatrix.postTranslate(dx, dy); checkMatrixAndInvalidate(); ViewParent parent = draweeView.getParent(); if (parent == null) { return; } if (mAllowParentInterceptOnEdge && !mScaleDragDetector.isScaling() && !mBlockParentIntercept) { if (mOrientation == HORIZONTAL && (mScrollEdgeX == EDGE_BOTH || (mScrollEdgeX == EDGE_LEFT && dx >= 1f) || (mScrollEdgeX == EDGE_RIGHT && dx <= -1f))) { parent.requestDisallowInterceptTouchEvent(false); } else if (mOrientation == VERTICAL && (mScrollEdgeY == EDGE_BOTH || (mScrollEdgeY == EDGE_TOP && dy >= 1f) || (mScrollEdgeY == EDGE_BOTTOM && dy <= -1f))) { parent.requestDisallowInterceptTouchEvent(false); } } else { parent.requestDisallowInterceptTouchEvent(true); } } }
@Override public void onFling(float startX, float startY, float velocityX, float velocityY) { DraweeView<GenericDraweeHierarchy> draweeView = getDraweeView(); if (draweeView == null) { return; } mCurrentFlingRunnable = new FlingRunnable(draweeView.getContext()); mCurrentFlingRunnable.fling(getViewWidth(), getViewHeight(), (int) velocityX, (int) velocityY); draweeView.post(mCurrentFlingRunnable); }
private void setMenuItemIcon(final MenuItem item, ReadableMap iconSource) { DraweeHolder<GenericDraweeHierarchy> holder = DraweeHolder.create(createDraweeHierarchy(), getContext()); ActionIconControllerListener controllerListener = new ActionIconControllerListener(item, holder); controllerListener.setIconImageInfo(getIconImageInfo(iconSource)); setIconSource(iconSource, controllerListener, holder); mActionsHolder.add(holder); }