弧形画廊的可能性

2023-11-26

是否可以更改 Android Gallery 的默认排列? 我的意思是我们能否将图库制作成一条弯曲的路径,其中图像将沿着弯曲的路径移动,同时它具有Android图库的所有属性?

如果可以的话,请告诉我你的想法。欢迎所有想法。

感谢和问候, 森


扩展 Gallery 并覆盖 drawChild。

对于每个需要绘制的子元素,都会调用drawChild。

protected boolean drawChild(Canvas canvas, View child, long drawingTime) {

    final int left = child.getLeft();

    int adjustedXOrigin = left - (getWidth() / 2) + (child.getWidth()/2);

    int newtop = (int) (ellipseYOffset - Math.sqrt( ellipseMinor2 * (1 - ((Math.pow(adjustedXOrigin, 2)) / ellipseMajor2))));
    newtop -= (child.getHeight() / 2);

    if( newtop >= 0 )
    {
        child.layout(left, newtop, left + child.getWidth(), newtop + child.getHeight());
        return super.drawChild(canvas, child, drawingTime);
    }

    return true;
}

在 onLayout 中我计算 ellipseYOffset。无论椭圆大小如何,这都会使中间选定的视图在视图中垂直居中。

ellipseYOffset = getMeasuredHeight() + (ellipseMinor - (getMeasuredHeight() / 2));

“if (newtop >= 0 )”部分是因为视图被随机绘制在奇怪的地方。这停止了​​。

编辑:完整代码

有一些动画的东西你不需要,我只是复制并粘贴了我的课程。

public class Carousel extends Gallery {

private static final float INITIAL_MINOR_RATIO = 0.75f;
private static final float INITIAL_MAJOR_RATIO = 1.0f;

private int mEllipseMajor;
private int mEllipseMinor;
private int mEllipseMajor2;
private int mEllipseMinor2;
private int mEllipseYOffset;

private Animation mGalleryAlphaOut;
private Animation mGalleryAlphaIn;

private OnAnimationEndListener mFadeInEndListener;
private OnAnimationEndListener mFadeOutEndListener;

private boolean mCustomEllipseDim = false;

private boolean mInfinite = true;

private int mXOff = 0;

private AnimationListener mFadeInAnimationListener = new AnimationListener() {
    public void onAnimationStart(Animation animation) {}
    public void onAnimationRepeat(Animation animation) {}
    public void onAnimationEnd(Animation animation) {
        if( mFadeInEndListener != null )
        {
            mFadeInEndListener.onAnimationEnd();
        }
    }
};

private AnimationListener mFadeOutAnimationListener = new AnimationListener() {
    public void onAnimationStart(Animation animation) {}
    public void onAnimationRepeat(Animation animation) {}
    public void onAnimationEnd(Animation animation) {
        if( mFadeOutEndListener != null )
        {
            mFadeOutEndListener.onAnimationEnd();
        }
    }
};

public Carousel(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

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

public Carousel(Context context) {
    super(context);
    init();
}

private void init()
{
    setHorizontalFadingEdgeEnabled(false);
    setCallbackDuringFling(true);
    setUnselectedAlpha(1.0f);
    setHapticFeedbackEnabled(false);

    int dur = getResources().getInteger(R.integer.transition_dur);

    mGalleryAlphaOut = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_out);
    mGalleryAlphaOut.setFillAfter(true);
    mGalleryAlphaOut.setDuration(dur);
    mGalleryAlphaOut.setAnimationListener(mFadeOutAnimationListener);
    mGalleryAlphaIn = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in);
    mGalleryAlphaIn.setFillAfter(true);
    mGalleryAlphaIn.setDuration(dur);
    mGalleryAlphaIn.setAnimationListener(mFadeInAnimationListener);
}

public int getEllipseMajor() {
    return mEllipseMajor;
}

public void setEllipseMajor(int ellipseMajor) {
    if( ellipseMajor == 0 )
    {
        mCustomEllipseDim = false;
    }
    this.mEllipseMajor = ellipseMajor;
}

public int getEllipseMinor() {
    return mEllipseMinor;
}

public void setEllipseMinor(int ellipseMinor) {
    if( ellipseMinor == 0 )
    {
        mCustomEllipseDim = false;
    }
    this.mEllipseMinor = ellipseMinor;
}

@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
    final int left = child.getLeft();
    final int childWidth = child.getWidth();
    final int childHeight = child.getHeight();

    int adjustedXOrigin = left - mXOff + (childWidth>>1);

    int newtop = (int) (mEllipseYOffset - Math.sqrt( mEllipseMinor2 * (1 - ((Math.pow(adjustedXOrigin, 2)) / mEllipseMajor2))));
    newtop -= (childHeight>>1);

    if( newtop >= 0 )
    {
        child.layout(left, newtop, left + childWidth, newtop + childHeight);
        return super.drawChild(canvas, child, drawingTime);
    }
    return true;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    if( !mCustomEllipseDim )
    {
        mEllipseMajor = (int) (getMeasuredWidth() * INITIAL_MAJOR_RATIO + 0.5f);
        mEllipseMinor = (int) (getMeasuredHeight() * INITIAL_MINOR_RATIO + 0.5f);
        mEllipseMajor2 = (int) Math.pow( mEllipseMajor, 2 );
        mEllipseMinor2 = (int) Math.pow( mEllipseMinor, 2 );
    }
    mEllipseYOffset = getMeasuredHeight() + (mEllipseMinor - (getMeasuredHeight() / 2));

    mXOff = (getWidth() / 2);
}

@Override
public void setAdapter(SpinnerAdapter adapter) {
    super.setAdapter(adapter);
    if( mInfinite )
    {
        resetPosition();
    }
}

public void resetPosition()
{
    int pos = Integer.MAX_VALUE / 2;
    if( getAdapter() != null && getAdapter().getClass() == CarouselAdapter.class )
    {
        int size = ((CarouselAdapter)getAdapter()).getList().size();
        if( size > 2 )
            pos = pos - (pos % ((CarouselAdapter)getAdapter()).getList().size());
        else
            pos = 0;
        setSelection(pos);
    }
}

public OnAnimationEndListener getFadeInEndListener() {
    return mFadeInEndListener;
}

public void setFadeInEndListener(OnAnimationEndListener fadeInEndListener) {
    this.mFadeInEndListener = fadeInEndListener;
}

public OnAnimationEndListener getFadeOutEndListener() {
    return mFadeOutEndListener;
}

public void setFadeOutEndListener(OnAnimationEndListener fadeOutEndListener) {
    this.mFadeOutEndListener = fadeOutEndListener;
}

public void fadeIn()
{
    startAnimation(mGalleryAlphaIn);
}

public void fadeOut()
{
    startAnimation(mGalleryAlphaOut);
}

public interface OnAnimationEndListener
{
    public abstract void onAnimationEnd();
}

//This disables the effect of a vehicle becoming focused when it is clicked.
@Override
public boolean onSingleTapUp(MotionEvent e) {
    if( getAdapter() != null )
    {
        if( pointToPosition((int)e.getX(), (int)e.getY()) != getSelectedItemPosition() )
            return true;
        else
            return super.onSingleTapUp(e);
    }
    else
        return true;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

弧形画廊的可能性 的相关文章

随机推荐

  • 隐藏超出 DIV 元素的文本

    我有一个固定宽度的 DIV 元素 其中有一些文本 其中没有任何空格供 HTML 解析器自动分成多行 文本超出了 DIV 的限制并弄乱了 pgae 有没有办法让超出边界的文本不可见 是否可以将其分成多行 或者更好地分成多行 并在每条折行的末尾
  • 多线程比单线程快吗?

    我想检查多线程是否比单线程快 然后我在这里做了一个演示 public class ThreadSpeedTest param args public static void main String args System out print
  • 将“C50 型号”转换为“rpart”型号

    有没有办法使用rpart plot用于绘制不属于的对象的库rpart 用于制作决策树 例如 这是经典的rpart and rpart plot正在运行的库 load libraries library rpart library rpart
  • mysql中什么是复合外键?

    在我正在使用的框架的文档中看到这个术语 复合外键 yii 什么是复合外键 在 mySql 数据库中 我的猜测是 考虑到两个表之间的关系 一个表有一列的名称与另一个表的 id 完全相同 免责声明 我做了尽职调查 并在谷歌上搜索了大约两分钟 但
  • VS 2010 Web 服务项目模板丢失?

    这可能是一个愚蠢的问题 但当我尝试创建新项目时 我找不到 Web 服务应用程序模板 您可能需要一个 WCF 服务项目 新建项目 gt Visual C 或 Visual Basic gt WCF 服务应用程序
  • 如何在 JSON 中显示带有尾随零的 BigDecimal 数字(而不是字符串)?

    在我的表示响应中 我有一个 BigDecimal 类型的字段 它的值为 2 30 但 json 响应将其显示为 2 3 有没有办法同时显示尾随零 而不将其显示为字符串 顺便说一句 我正在使用杰克逊库 version 2 3 needs to
  • 还有一个“无法加载文件或程序集......或其依赖项之一。系统找不到指定的文件”

    我有一个带有 NUnit 测试的 dll 运行良好 我将其从 Any CPU 转换为 x86 项目 因为我需要跨不同平台可靠地使用 SQLite 因此我需要包含 32 位 System Data SQLite dll 并让所有内容都引用它
  • 像 iPhone 上的地址簿排序一样对 NSString 的 NSArray 进行排序

    我有一个字符串数组 名称 我想像 iPhone 上的地址簿对它们进行排序一样对它们进行排序 例如 li gt E 下 例如 li gt A 下 例如 4li gt 在 下 有什么建议么 您需要对字符串执行不区分变音符号的比较 NSStrin
  • 对卷积神经网络中 1D、2D 和 3D 卷积的直观理解[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 谁能通过示例清楚地解释卷积神经网络 深度学习中 中 1D 2D 和 3D 卷积之间的区别 我想用图片来解释C3D 简而言之 卷积方向 输出形状很重要 一维卷积 基础 just 1 计
  • getView() 返回 null

    我基本上有一个AsyncTask 从主运行Activity 填充一个ViewPager在一个片段内 我正在膨胀 xml 布局文件来填充ViewPager 问题是我无法获取指向布局内视图 imageview textview 的指针 以便我可
  • Android Deeplink pathPrefix 属性被忽略

    我在清单文件中为我的 Android 应用程序定义了一个深层链接
  • 如何在MVC中使用bootstrap modal编辑表格数据?

    我在 MVC 视图中有一个表 显示员工详细信息 我想添加编辑功能 但我不想在新页面中打开它 而是想使用引导模式来显示它 http twitter github com bootstrap javascript html modals 我认为
  • 在 Swing 应用程序中显示 HTML 表单并与之交互

    一个应用程序生成一些HTML 页面应该显示在应用程序本身中 These HTML 页面含有一些forms用户将使用它来输入一些值 到目前为止我已经用过文本窗格这使得HTML完美 但我不知道如何与表单交互以检索用户输入的值 是否可以使用 JT
  • 为什么 File.ReadAllBytes 结果与使用 File.ReadAllText 时不同?

    我有一个内容为 test 的文本文件 UTF 8 编码 我尝试从该文件中获取字节数组并将其转换为字符串 但它包含一个奇怪的字符 我使用以下代码 var path C Users Tester Desktop test test txt UT
  • Java javax.swing.Timer 在新线程上运行吗?

    我正在使用 javax swing Timer 来安排和运行事件 但它似乎冻结了 GUI 只是想知道这些事件是否在单独的线程上运行 或者我是否必须自己执行 Thanks 尽管所有 Timer 使用单个共享线程 由第一个执行的 Timer 对
  • Py4JJavaError:调用 o1670.collectToPython 时发生错误

    我正在尝试将 Spark RDD 转换为 Pandas DataFrame 我使用 csv 文件作为示例 该文件有 10 以下是前 3 行 可堆叠储物架的 Eldon 底座 铂金 Muhammed MacIntyre 3 213 25 38
  • 为什么 .NET 正则表达式和 Visual Studio 的正则表达式之间存在差异?

    我终于找到了对 Visual Studio 的引用查找和替换的正则表达式 and NET的正则表达式包 现在出于病态的好奇心 我想知道 为什么有区别 我确信有技术 历史或可用性方面的原因 但这让bajeepers感到困惑 sp 一开始就对我
  • 如何包含另一个php文件?

    我有一个 php 文件 我想包含另一个具有 css 链接标签和 javascript 源标签的 php 文件 但是当我尝试包含它们时 它不会添加到页面中 我的 php 页面 通用 php 有谁知道出了什么问题吗 谢谢 PHP s inclu
  • 合并两个数据框的所有组合

    我遇到了一个复杂的问题 我有两个数据框 其中有一种编号和规格 颜色 零件 的组合 每个数据框适用于 4 台不同的机器 每台机器总共有 5 个规格 实际上甚至更多的机器和规格 以下是两个示例数据框 df1 lt data frame nr c
  • 弧形画廊的可能性

    是否可以更改 Android Gallery 的默认排列 我的意思是我们能否将图库制作成一条弯曲的路径 其中图像将沿着弯曲的路径移动 同时它具有Android图库的所有属性 如果可以的话 请告诉我你的想法 欢迎所有想法 感谢和问候 森 扩展