使用ObjectAnimator旋转Gallery里面的图片,gallery的ItemClick无效

akebrt 2016-10-15 01:41:54
代码如下:
adapter代码
public class GalleryBugAdapter extends BaseAdapter{

private ArrayList<HashMap<String, String>> list;

private Context mContext;

private ImageView mImg;

public Bitmap bitmap;

private Gallery gallery;

private int tag = 0;

// rotate
private int nowAngle = 0, toAngle = 0;

private int w, h;

public GalleryBugAdapter(ArrayList<HashMap<String, String>> list, Context context, Gallery gallery) {
if (list != null) {
this.list = list;
} else {
this.list = new ArrayList<HashMap<String, String>>();
}
this.mContext = context;
this.gallery = gallery;
}

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

@Override
public Object getItem(int position) {
return list.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (tag != position) {
nowAngle = 0;
toAngle = 0;
}

tag = position;
mImg = new ImageView(mContext);

// 父控件的宽高
w = parent.getWidth();
h = parent.getHeight();

String path = list.get(position).get("list_img_path");
Bitmap bitmap = getBitmap(path, w, h);

mImg.setImageBitmap(bitmap);
mImg.setTag(position);
mImg.setFocusable(false);
mImg.setClickable(false);
mImg.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

return mImg;
}

private Bitmap getBitmap(String imgPath, int nWidth, int nHeight) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
if (nWidth != 0 && nHeight != 0) {
options.inJustDecodeBounds = true;
bitmap = BitmapFactory.decodeFile(imgPath, options);
if (options.outWidth <= nWidth && options.outHeight <= nHeight) {
mImg.setScaleType(ScaleType.CENTER_INSIDE);
return BitmapFactory.decodeFile(imgPath);
}
int hRatio = (int) Math.ceil(options.outHeight / (double) nHeight);
int wRatio = (int) Math.ceil(options.outWidth / (double) nWidth);
options.inSampleSize = (hRatio > wRatio) ? hRatio : wRatio;
options.inJustDecodeBounds = false;
}
bitmap = BitmapFactory.decodeFile(imgPath, options);
return bitmap;
}

public void Rotate(boolean flag, int angle) {
mImg = (ImageView) gallery.findViewWithTag(tag);
AnimatorSet aSet = new AnimatorSet();
if (flag) {
toAngle = (toAngle + 90) % 360;
} else {
toAngle = (toAngle - 90) % 360;
}

if (angle == 1) {
toAngle = 0;
}
ObjectAnimator oAX = ObjectAnimator.ofFloat(mImg, "rotation", nowAngle, toAngle);
nowAngle = toAngle;
aSet.play(oAX);
aSet.setDuration(0);
aSet.start();
}
}

控件属性
public void initGallery(int position, ArrayList<HashMap<String, String>> photoList) {

if (layoutGallery == null) {
layoutGallery = ((ViewStub) findViewById(R.id.photo_gallery)).inflate();
}

photoGallery = (Gallery) layoutGallery.findViewById(R.id.Gallery);

adapter = new GalleryAdapter(photoList, this, photoGallery);
photoGallery.setAdapter(adapter);
photoGallery.setOnItemSelectedListener(new OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> parent, View view, int item, long id) {
Log.d("media", "dell-ItemSelected");
}

@Override
public void onNothingSelected(AdapterView<?> parent) {

}
});

photoGallery.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("media", "dell-ItemClick");
}
});

btnRotate1 = (Button) findViewById(R.id.btnRotate1);
btnRotate2 = (Button) findViewById(R.id.btnRotate2);
btnRotate1.setOnClickListener(new OnClickListener() {// 逆时针旋转90度

@Override
public void onClick(View v) {
Log.e("PhotoRotate", "BUG-旋转后会让gallery的");
adapter.Rotate(false, 0);
}
});
btnRotate2.setOnClickListener(new OnClickListener() {// 顺时针旋转90度

@Override
public void onClick(View v) {
adapter.Rotate(true, 0);
}
});
}

如题,用以上代码旋转图片后 ,出现现象:
顺时针旋转90度,会让以图片为中心,第一象限的区域可以感应到点击事件,其余三个象限完全无效;
再旋转90度,让可以点击的区域也旋转90度,第四象限区域可以感应点击事件,其余三个象限区域点击无效;
然后再旋转,可点击区域转到第三象限。

逆时针旋转类似
当图片转回原始的角度,然后所有区域都可以点击了,这是怎么一回事???
...全文
307 2 打赏 收藏 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
akebrt 2016-10-17
  • 打赏
  • 举报
回复
有没有人遇到过这样的?
akebrt 2016-10-15
  • 打赏
  • 举报
回复
这Bug 大神帮忙看看是怎样出来的
内容概要:本文详细描述了机械零件Part4的设计与建模过程,重点围绕三维建模中的几何构造操作展开。首先基于原零件三视图确定关键尺寸,依次创建多个同心圆柱体结构,包括外层圆柱体(52、52、5)、中间圆柱体(25、25、7)以及中心孔结构(16、16、12)。随后对底部圆柱体进行临时加高处理,以便在顶面草绘中构建辅助图形:以计算得出的半径17.5画圆,并在其接触面上方绘制半径为3的小圆,进而引出两条分别成60°和-60°的斜线,配合一条水平线形成三角形轮廓。接着在其余两角复制相同的小圆结构,清理多余线条后完成草图设计。利用该草图执行“拉伸切除”操作,深度设为16.28mm,实现特征开槽。最后将底部圆柱体恢复原始高度5mm,完成整体结构修改。; 适合人群:具备基础CAD建模能力的机械设计人员或工科类学生;熟悉SolidWorks、AutoCAD等三维设计软件的操作者;从事零部件逆向设计或结构优化的技术人员。; 使用场景及目标:①用于学习复杂零件的分步建模方法,掌握从三视图到三维实体的转换技巧;②理解拉伸、切除、草图约束、包围盒设置等核心建模命令的实际应用;③提升对尺寸链计算、辅助线构建及几何关系控制的理解与实践能力。; 阅读建议:建议结合文中参数逐步在建模软件中复现操作,重点关注草图绘制逻辑与切除特征的关联性,注意各步骤间的顺序依赖关系,避免因尺寸或约束错误导致建模失败。
内容概要:本文系统阐述了基于格子Boltzmann方法(Lattice Boltzmann Method, LBM)对二维通道内多孔介质流动进行数值模拟的理论体系、Matlab代码实现流程及结果验证方法。深入剖析了LBM在处理复杂流体系统尤其是不规则几何结构多孔介质流动中的独特优势,详细介绍了模型构建过程、边界条件设定、碰撞与传播环节的算法实现机制,并通过Matlab编程完成仿真运算,实现了对速度场、压力场等关键物理量的可视化分析与精度验证,确保模拟结果具备良好的准确性与可靠性。; 适合人群:具备流体力学基础知识和一定Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事多孔介质流动、计算流体力学(CFD)或LBM方法研究的相关领域研究人员。; 使用场景及目标:①掌握格子Boltzmann方法的核心原理及其在多孔介质流动模拟中的具体应用;②学习利用Matlab实现LBM算法并开展科学计算与结果可视化的方法;③为相关科研项目、学术论文复现或实际工程仿真提供可复用的代码框架与技术实施路径。; 阅读建议:建议读者结合流体力学与数值计算相关背景知识,逐步理解算法推导过程,动手运行并调试所提供的Matlab代码,通过调整参数或几何模型加深对LBM方法灵活性与适用性的认识,同时鼓励将该方法拓展至三维流动或多物理场耦合问题的研究中。

80,490

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧